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,302 @@
|
|
|
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
|
+
*
|
|
27
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
28
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
29
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
30
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
31
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
32
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
33
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
34
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
35
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
36
|
+
* the provisions above, a recipient may use your version of this file under
|
|
37
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
38
|
+
*
|
|
39
|
+
* ***** END LICENSE BLOCK ***** */
|
|
40
|
+
|
|
41
|
+
/* Possibly shared proto object for XPCWrappedNative. */
|
|
42
|
+
|
|
43
|
+
#include "xpcprivate.h"
|
|
44
|
+
|
|
45
|
+
#if defined(DEBUG_xpc_hacker) || defined(DEBUG)
|
|
46
|
+
PRInt32 XPCWrappedNativeProto::gDEBUG_LiveProtoCount = 0;
|
|
47
|
+
#endif
|
|
48
|
+
|
|
49
|
+
XPCWrappedNativeProto::XPCWrappedNativeProto(XPCWrappedNativeScope* Scope,
|
|
50
|
+
nsIClassInfo* ClassInfo,
|
|
51
|
+
PRUint32 ClassInfoFlags,
|
|
52
|
+
XPCNativeSet* Set,
|
|
53
|
+
QITableEntry* offsets)
|
|
54
|
+
: mScope(Scope),
|
|
55
|
+
mJSProtoObject(nsnull),
|
|
56
|
+
mClassInfo(ClassInfo),
|
|
57
|
+
mClassInfoFlags(ClassInfoFlags),
|
|
58
|
+
mSet(Set),
|
|
59
|
+
mSecurityInfo(nsnull),
|
|
60
|
+
mScriptableInfo(nsnull),
|
|
61
|
+
mOffsets(offsets)
|
|
62
|
+
{
|
|
63
|
+
// This native object lives as long as its associated JSObject - killed
|
|
64
|
+
// by finalization of the JSObject (or explicitly if Init fails).
|
|
65
|
+
|
|
66
|
+
MOZ_COUNT_CTOR(XPCWrappedNativeProto);
|
|
67
|
+
|
|
68
|
+
#ifdef DEBUG
|
|
69
|
+
PR_AtomicIncrement(&gDEBUG_LiveProtoCount);
|
|
70
|
+
#endif
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
XPCWrappedNativeProto::~XPCWrappedNativeProto()
|
|
74
|
+
{
|
|
75
|
+
NS_ASSERTION(!mJSProtoObject, "JSProtoObject still alive");
|
|
76
|
+
|
|
77
|
+
MOZ_COUNT_DTOR(XPCWrappedNativeProto);
|
|
78
|
+
|
|
79
|
+
#ifdef DEBUG
|
|
80
|
+
PR_AtomicDecrement(&gDEBUG_LiveProtoCount);
|
|
81
|
+
#endif
|
|
82
|
+
|
|
83
|
+
// Note that our weak ref to mScope is not to be trusted at this point.
|
|
84
|
+
|
|
85
|
+
XPCNativeSet::ClearCacheEntryForClassInfo(mClassInfo);
|
|
86
|
+
|
|
87
|
+
delete mScriptableInfo;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
JSBool
|
|
91
|
+
XPCWrappedNativeProto::Init(
|
|
92
|
+
XPCCallContext& ccx,
|
|
93
|
+
JSBool isGlobal,
|
|
94
|
+
const XPCNativeScriptableCreateInfo* scriptableCreateInfo)
|
|
95
|
+
{
|
|
96
|
+
if(scriptableCreateInfo && scriptableCreateInfo->GetCallback())
|
|
97
|
+
{
|
|
98
|
+
mScriptableInfo =
|
|
99
|
+
XPCNativeScriptableInfo::Construct(ccx, isGlobal, scriptableCreateInfo);
|
|
100
|
+
if(!mScriptableInfo)
|
|
101
|
+
return JS_FALSE;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
JSClass* jsclazz;
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
if(mScriptableInfo)
|
|
108
|
+
{
|
|
109
|
+
const XPCNativeScriptableFlags& flags(mScriptableInfo->GetFlags());
|
|
110
|
+
|
|
111
|
+
if(flags.AllowPropModsToPrototype())
|
|
112
|
+
{
|
|
113
|
+
jsclazz = flags.WantCall() ?
|
|
114
|
+
&XPC_WN_ModsAllowed_WithCall_Proto_JSClass :
|
|
115
|
+
&XPC_WN_ModsAllowed_NoCall_Proto_JSClass;
|
|
116
|
+
}
|
|
117
|
+
else
|
|
118
|
+
{
|
|
119
|
+
jsclazz = flags.WantCall() ?
|
|
120
|
+
&XPC_WN_NoMods_WithCall_Proto_JSClass :
|
|
121
|
+
&XPC_WN_NoMods_NoCall_Proto_JSClass;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else
|
|
125
|
+
{
|
|
126
|
+
jsclazz = &XPC_WN_NoMods_NoCall_Proto_JSClass;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
JSObject *parent = mScope->GetGlobalJSObject();
|
|
130
|
+
|
|
131
|
+
mJSProtoObject =
|
|
132
|
+
xpc_NewSystemInheritingJSObject(ccx, jsclazz,
|
|
133
|
+
mScope->GetPrototypeJSObject(),
|
|
134
|
+
parent);
|
|
135
|
+
|
|
136
|
+
JSBool ok = mJSProtoObject && JS_SetPrivate(ccx, mJSProtoObject, this);
|
|
137
|
+
|
|
138
|
+
if(ok && scriptableCreateInfo)
|
|
139
|
+
{
|
|
140
|
+
nsIXPCScriptable *callback = scriptableCreateInfo->GetCallback();
|
|
141
|
+
if(callback)
|
|
142
|
+
{
|
|
143
|
+
nsresult rv = callback->PostCreatePrototype(ccx, mJSProtoObject);
|
|
144
|
+
if(NS_FAILED(rv))
|
|
145
|
+
{
|
|
146
|
+
XPCThrower::Throw(rv, ccx);
|
|
147
|
+
return JS_FALSE;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
DEBUG_ReportShadowedMembers(mSet, nsnull, this);
|
|
153
|
+
|
|
154
|
+
return ok;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
void
|
|
158
|
+
XPCWrappedNativeProto::JSProtoObjectFinalized(JSContext *cx, JSObject *obj)
|
|
159
|
+
{
|
|
160
|
+
NS_ASSERTION(obj == mJSProtoObject, "huh?");
|
|
161
|
+
|
|
162
|
+
// Map locking is not necessary since we are running gc.
|
|
163
|
+
|
|
164
|
+
if(IsShared())
|
|
165
|
+
{
|
|
166
|
+
// Only remove this proto from the map if it is the one in the map.
|
|
167
|
+
ClassInfo2WrappedNativeProtoMap* map =
|
|
168
|
+
GetScope()->GetWrappedNativeProtoMap();
|
|
169
|
+
if(map->Find(mClassInfo) == this)
|
|
170
|
+
map->Remove(mClassInfo);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
GetRuntime()->GetDetachedWrappedNativeProtoMap()->Remove(this);
|
|
174
|
+
GetRuntime()->GetDyingWrappedNativeProtoMap()->Add(this);
|
|
175
|
+
|
|
176
|
+
mJSProtoObject = nsnull;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
void
|
|
180
|
+
XPCWrappedNativeProto::SystemIsBeingShutDown(JSContext* cx)
|
|
181
|
+
{
|
|
182
|
+
// Note that the instance might receive this call multiple times
|
|
183
|
+
// as we walk to here from various places.
|
|
184
|
+
|
|
185
|
+
#ifdef XPC_TRACK_PROTO_STATS
|
|
186
|
+
static PRBool DEBUG_DumpedStats = PR_FALSE;
|
|
187
|
+
if(!DEBUG_DumpedStats)
|
|
188
|
+
{
|
|
189
|
+
printf("%d XPCWrappedNativeProto(s) alive at shutdown\n",
|
|
190
|
+
gDEBUG_LiveProtoCount);
|
|
191
|
+
DEBUG_DumpedStats = PR_TRUE;
|
|
192
|
+
}
|
|
193
|
+
#endif
|
|
194
|
+
|
|
195
|
+
if(mJSProtoObject)
|
|
196
|
+
{
|
|
197
|
+
// short circuit future finalization
|
|
198
|
+
JS_SetPrivate(cx, mJSProtoObject, nsnull);
|
|
199
|
+
mJSProtoObject = nsnull;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// static
|
|
204
|
+
XPCWrappedNativeProto*
|
|
205
|
+
XPCWrappedNativeProto::GetNewOrUsed(XPCCallContext& ccx,
|
|
206
|
+
XPCWrappedNativeScope* Scope,
|
|
207
|
+
nsIClassInfo* ClassInfo,
|
|
208
|
+
const XPCNativeScriptableCreateInfo* ScriptableCreateInfo,
|
|
209
|
+
JSBool ForceNoSharing,
|
|
210
|
+
JSBool isGlobal,
|
|
211
|
+
QITableEntry* offsets)
|
|
212
|
+
{
|
|
213
|
+
NS_ASSERTION(Scope, "bad param");
|
|
214
|
+
NS_ASSERTION(ClassInfo, "bad param");
|
|
215
|
+
|
|
216
|
+
AutoMarkingWrappedNativeProtoPtr proto(ccx);
|
|
217
|
+
ClassInfo2WrappedNativeProtoMap* map;
|
|
218
|
+
XPCLock* lock;
|
|
219
|
+
JSBool shared;
|
|
220
|
+
|
|
221
|
+
JSUint32 ciFlags;
|
|
222
|
+
if(NS_FAILED(ClassInfo->GetFlags(&ciFlags)))
|
|
223
|
+
ciFlags = 0;
|
|
224
|
+
|
|
225
|
+
if(ciFlags & XPC_PROTO_DONT_SHARE)
|
|
226
|
+
{
|
|
227
|
+
NS_ERROR("reserved flag set!");
|
|
228
|
+
ciFlags &= ~XPC_PROTO_DONT_SHARE;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if(ForceNoSharing || (ciFlags & nsIClassInfo::PLUGIN_OBJECT) ||
|
|
232
|
+
(ScriptableCreateInfo &&
|
|
233
|
+
ScriptableCreateInfo->GetFlags().DontSharePrototype()))
|
|
234
|
+
{
|
|
235
|
+
ciFlags |= XPC_PROTO_DONT_SHARE;
|
|
236
|
+
shared = JS_FALSE;
|
|
237
|
+
}
|
|
238
|
+
else
|
|
239
|
+
{
|
|
240
|
+
shared = JS_TRUE;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if(shared)
|
|
244
|
+
{
|
|
245
|
+
map = Scope->GetWrappedNativeProtoMap();
|
|
246
|
+
lock = Scope->GetRuntime()->GetMapLock();
|
|
247
|
+
{ // scoped lock
|
|
248
|
+
XPCAutoLock al(lock);
|
|
249
|
+
proto = map->Find(ClassInfo);
|
|
250
|
+
if(proto)
|
|
251
|
+
return proto;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
AutoMarkingNativeSetPtr set(ccx);
|
|
256
|
+
set = XPCNativeSet::GetNewOrUsed(ccx, ClassInfo);
|
|
257
|
+
if(!set)
|
|
258
|
+
return nsnull;
|
|
259
|
+
|
|
260
|
+
proto = new XPCWrappedNativeProto(Scope, ClassInfo, ciFlags, set, offsets);
|
|
261
|
+
|
|
262
|
+
if(!proto || !proto->Init(ccx, isGlobal, ScriptableCreateInfo))
|
|
263
|
+
{
|
|
264
|
+
delete proto.get();
|
|
265
|
+
return nsnull;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if(shared)
|
|
269
|
+
{ // scoped lock
|
|
270
|
+
XPCAutoLock al(lock);
|
|
271
|
+
map->Add(ClassInfo, proto);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
return proto;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
void
|
|
278
|
+
XPCWrappedNativeProto::DebugDump(PRInt16 depth)
|
|
279
|
+
{
|
|
280
|
+
#ifdef DEBUG
|
|
281
|
+
depth-- ;
|
|
282
|
+
XPC_LOG_ALWAYS(("XPCWrappedNativeProto @ %x", this));
|
|
283
|
+
XPC_LOG_INDENT();
|
|
284
|
+
XPC_LOG_ALWAYS(("gDEBUG_LiveProtoCount is %d", gDEBUG_LiveProtoCount));
|
|
285
|
+
XPC_LOG_ALWAYS(("mScope @ %x", mScope));
|
|
286
|
+
XPC_LOG_ALWAYS(("mJSProtoObject @ %x", mJSProtoObject));
|
|
287
|
+
XPC_LOG_ALWAYS(("mSet @ %x", mSet));
|
|
288
|
+
XPC_LOG_ALWAYS(("mSecurityInfo of %x", mSecurityInfo));
|
|
289
|
+
XPC_LOG_ALWAYS(("mScriptableInfo @ %x", mScriptableInfo));
|
|
290
|
+
if(depth && mScriptableInfo)
|
|
291
|
+
{
|
|
292
|
+
XPC_LOG_INDENT();
|
|
293
|
+
XPC_LOG_ALWAYS(("mScriptable @ %x", mScriptableInfo->GetCallback()));
|
|
294
|
+
XPC_LOG_ALWAYS(("mFlags of %x", (PRUint32)mScriptableInfo->GetFlags()));
|
|
295
|
+
XPC_LOG_ALWAYS(("mJSClass @ %x", mScriptableInfo->GetJSClass()));
|
|
296
|
+
XPC_LOG_OUTDENT();
|
|
297
|
+
}
|
|
298
|
+
XPC_LOG_OUTDENT();
|
|
299
|
+
#endif
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
|
|
@@ -0,0 +1,991 @@
|
|
|
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) 1999
|
|
22
|
+
* the Initial Developer. All Rights Reserved.
|
|
23
|
+
*
|
|
24
|
+
* Contributor(s):
|
|
25
|
+
* John Bandhauer <jband@netscape.com> (original author)
|
|
26
|
+
*
|
|
27
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
28
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
29
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
30
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
31
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
32
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
33
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
34
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
35
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
36
|
+
* the provisions above, a recipient may use your version of this file under
|
|
37
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
38
|
+
*
|
|
39
|
+
* ***** END LICENSE BLOCK ***** */
|
|
40
|
+
|
|
41
|
+
/* Class used to manage the wrapped native objects within a JS scope. */
|
|
42
|
+
|
|
43
|
+
#include "xpcprivate.h"
|
|
44
|
+
#ifdef DEBUG
|
|
45
|
+
#include "XPCNativeWrapper.h"
|
|
46
|
+
#endif
|
|
47
|
+
|
|
48
|
+
/***************************************************************************/
|
|
49
|
+
|
|
50
|
+
#ifdef XPC_TRACK_SCOPE_STATS
|
|
51
|
+
static int DEBUG_TotalScopeCount;
|
|
52
|
+
static int DEBUG_TotalLiveScopeCount;
|
|
53
|
+
static int DEBUG_TotalMaxScopeCount;
|
|
54
|
+
static int DEBUG_TotalScopeTraversalCount;
|
|
55
|
+
static PRBool DEBUG_DumpedStats;
|
|
56
|
+
#endif
|
|
57
|
+
|
|
58
|
+
#ifdef DEBUG
|
|
59
|
+
static void DEBUG_TrackNewScope(XPCWrappedNativeScope* scope)
|
|
60
|
+
{
|
|
61
|
+
#ifdef XPC_TRACK_SCOPE_STATS
|
|
62
|
+
DEBUG_TotalScopeCount++;
|
|
63
|
+
DEBUG_TotalLiveScopeCount++;
|
|
64
|
+
if(DEBUG_TotalMaxScopeCount < DEBUG_TotalLiveScopeCount)
|
|
65
|
+
DEBUG_TotalMaxScopeCount = DEBUG_TotalLiveScopeCount;
|
|
66
|
+
#endif
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static void DEBUG_TrackDeleteScope(XPCWrappedNativeScope* scope)
|
|
70
|
+
{
|
|
71
|
+
#ifdef XPC_TRACK_SCOPE_STATS
|
|
72
|
+
DEBUG_TotalLiveScopeCount--;
|
|
73
|
+
#endif
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void DEBUG_TrackScopeTraversal()
|
|
77
|
+
{
|
|
78
|
+
#ifdef XPC_TRACK_SCOPE_STATS
|
|
79
|
+
DEBUG_TotalScopeTraversalCount++;
|
|
80
|
+
#endif
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static void DEBUG_TrackScopeShutdown()
|
|
84
|
+
{
|
|
85
|
+
#ifdef XPC_TRACK_SCOPE_STATS
|
|
86
|
+
if(!DEBUG_DumpedStats)
|
|
87
|
+
{
|
|
88
|
+
DEBUG_DumpedStats = PR_TRUE;
|
|
89
|
+
printf("%d XPCWrappedNativeScope(s) were constructed.\n",
|
|
90
|
+
DEBUG_TotalScopeCount);
|
|
91
|
+
|
|
92
|
+
printf("%d XPCWrappedNativeScopes(s) max alive at one time.\n",
|
|
93
|
+
DEBUG_TotalMaxScopeCount);
|
|
94
|
+
|
|
95
|
+
printf("%d XPCWrappedNativeScope(s) alive now.\n" ,
|
|
96
|
+
DEBUG_TotalLiveScopeCount);
|
|
97
|
+
|
|
98
|
+
printf("%d traversals of Scope list.\n",
|
|
99
|
+
DEBUG_TotalScopeTraversalCount);
|
|
100
|
+
}
|
|
101
|
+
#endif
|
|
102
|
+
}
|
|
103
|
+
#else
|
|
104
|
+
#define DEBUG_TrackNewScope(scope) ((void)0)
|
|
105
|
+
#define DEBUG_TrackDeleteScope(scope) ((void)0)
|
|
106
|
+
#define DEBUG_TrackScopeTraversal() ((void)0)
|
|
107
|
+
#define DEBUG_TrackScopeShutdown() ((void)0)
|
|
108
|
+
#endif
|
|
109
|
+
|
|
110
|
+
/***************************************************************************/
|
|
111
|
+
|
|
112
|
+
XPCWrappedNativeScope* XPCWrappedNativeScope::gScopes = nsnull;
|
|
113
|
+
XPCWrappedNativeScope* XPCWrappedNativeScope::gDyingScopes = nsnull;
|
|
114
|
+
|
|
115
|
+
// static
|
|
116
|
+
XPCWrappedNativeScope*
|
|
117
|
+
XPCWrappedNativeScope::GetNewOrUsed(XPCCallContext& ccx, JSObject* aGlobal)
|
|
118
|
+
{
|
|
119
|
+
|
|
120
|
+
XPCWrappedNativeScope* scope = FindInJSObjectScope(ccx, aGlobal, JS_TRUE);
|
|
121
|
+
if(!scope)
|
|
122
|
+
scope = new XPCWrappedNativeScope(ccx, aGlobal);
|
|
123
|
+
else
|
|
124
|
+
{
|
|
125
|
+
// We need to call SetGlobal in order to refresh our cached
|
|
126
|
+
// mPrototypeJSObject and mPrototypeJSFunction and to clear
|
|
127
|
+
// mPrototypeNoHelper (so we get a new one if requested in the
|
|
128
|
+
// new scope) in the case where the global object is being
|
|
129
|
+
// reused (JS_ClearScope has been called). NOTE: We are only
|
|
130
|
+
// called by nsXPConnect::InitClasses.
|
|
131
|
+
scope->SetGlobal(ccx, aGlobal);
|
|
132
|
+
}
|
|
133
|
+
return scope;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
XPCWrappedNativeScope::XPCWrappedNativeScope(XPCCallContext& ccx,
|
|
137
|
+
JSObject* aGlobal)
|
|
138
|
+
: mRuntime(ccx.GetRuntime()),
|
|
139
|
+
mWrappedNativeMap(Native2WrappedNativeMap::newMap(XPC_NATIVE_MAP_SIZE)),
|
|
140
|
+
mWrappedNativeProtoMap(ClassInfo2WrappedNativeProtoMap::newMap(XPC_NATIVE_PROTO_MAP_SIZE)),
|
|
141
|
+
mWrapperMap(WrappedNative2WrapperMap::newMap(XPC_WRAPPER_MAP_SIZE)),
|
|
142
|
+
mComponents(nsnull),
|
|
143
|
+
mNext(nsnull),
|
|
144
|
+
mGlobalJSObject(nsnull),
|
|
145
|
+
mPrototypeJSObject(nsnull),
|
|
146
|
+
mPrototypeJSFunction(nsnull),
|
|
147
|
+
mPrototypeNoHelper(nsnull)
|
|
148
|
+
{
|
|
149
|
+
// add ourselves to the scopes list
|
|
150
|
+
{ // scoped lock
|
|
151
|
+
XPCAutoLock lock(mRuntime->GetMapLock());
|
|
152
|
+
|
|
153
|
+
#ifdef DEBUG
|
|
154
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
155
|
+
NS_ASSERTION(aGlobal != cur->GetGlobalJSObject(), "dup object");
|
|
156
|
+
#endif
|
|
157
|
+
|
|
158
|
+
mNext = gScopes;
|
|
159
|
+
gScopes = this;
|
|
160
|
+
|
|
161
|
+
// Grab the XPCContext associated with our context.
|
|
162
|
+
mContext = XPCContext::GetXPCContext(ccx.GetJSContext());
|
|
163
|
+
mContext->AddScope(this);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if(aGlobal)
|
|
167
|
+
SetGlobal(ccx, aGlobal);
|
|
168
|
+
|
|
169
|
+
DEBUG_TrackNewScope(this);
|
|
170
|
+
MOZ_COUNT_CTOR(XPCWrappedNativeScope);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// static
|
|
174
|
+
JSBool
|
|
175
|
+
XPCWrappedNativeScope::IsDyingScope(XPCWrappedNativeScope *scope)
|
|
176
|
+
{
|
|
177
|
+
for(XPCWrappedNativeScope *cur = gDyingScopes; cur; cur = cur->mNext)
|
|
178
|
+
{
|
|
179
|
+
if(scope == cur)
|
|
180
|
+
return JS_TRUE;
|
|
181
|
+
}
|
|
182
|
+
return JS_FALSE;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
void
|
|
186
|
+
XPCWrappedNativeScope::SetComponents(nsXPCComponents* aComponents)
|
|
187
|
+
{
|
|
188
|
+
NS_IF_ADDREF(aComponents);
|
|
189
|
+
NS_IF_RELEASE(mComponents);
|
|
190
|
+
mComponents = aComponents;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Dummy JS class to let wrappers w/o an xpc prototype share
|
|
194
|
+
// scopes. By doing this we avoid allocating a new scope for every
|
|
195
|
+
// wrapper on creation of the wrapper, and most wrappers won't need
|
|
196
|
+
// their own scope at all for the lifetime of the wrapper.
|
|
197
|
+
// JSCLASS_HAS_PRIVATE is key here (even though there's never anything
|
|
198
|
+
// in the private data slot in these prototypes), as the number of
|
|
199
|
+
// reserved slots in this class needs to match that of the wrappers
|
|
200
|
+
// for the JS engine to share scopes.
|
|
201
|
+
|
|
202
|
+
JSClass XPC_WN_NoHelper_Proto_JSClass = {
|
|
203
|
+
"XPC_WN_NoHelper_Proto_JSClass",// name;
|
|
204
|
+
JSCLASS_HAS_PRIVATE, // flags;
|
|
205
|
+
|
|
206
|
+
/* Mandatory non-null function pointer members. */
|
|
207
|
+
JS_PropertyStub, // addProperty;
|
|
208
|
+
JS_PropertyStub, // delProperty;
|
|
209
|
+
JS_PropertyStub, // getProperty;
|
|
210
|
+
JS_PropertyStub, // setProperty;
|
|
211
|
+
JS_EnumerateStub, // enumerate;
|
|
212
|
+
JS_ResolveStub, // resolve;
|
|
213
|
+
JS_ConvertStub, // convert;
|
|
214
|
+
JS_FinalizeStub, // finalize;
|
|
215
|
+
|
|
216
|
+
/* Optionally non-null members start here. */
|
|
217
|
+
XPC_WN_Proto_GetObjectOps, // getObjectOps;
|
|
218
|
+
nsnull, // checkAccess;
|
|
219
|
+
nsnull, // call;
|
|
220
|
+
nsnull, // construct;
|
|
221
|
+
nsnull, // xdrObject;
|
|
222
|
+
nsnull, // hasInstance;
|
|
223
|
+
nsnull, // mark/trace;
|
|
224
|
+
nsnull // spare;
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
void
|
|
229
|
+
XPCWrappedNativeScope::SetGlobal(XPCCallContext& ccx, JSObject* aGlobal)
|
|
230
|
+
{
|
|
231
|
+
// We allow for calling this more than once. This feature is used by
|
|
232
|
+
// nsXPConnect::InitClassesWithNewWrappedGlobal.
|
|
233
|
+
|
|
234
|
+
mGlobalJSObject = aGlobal;
|
|
235
|
+
#ifndef XPCONNECT_STANDALONE
|
|
236
|
+
mScriptObjectPrincipal = nsnull;
|
|
237
|
+
// Now init our script object principal, if the new global has one
|
|
238
|
+
|
|
239
|
+
const JSClass* jsClass = STOBJ_GET_CLASS(aGlobal);
|
|
240
|
+
if(!(~jsClass->flags & (JSCLASS_HAS_PRIVATE |
|
|
241
|
+
JSCLASS_PRIVATE_IS_NSISUPPORTS)))
|
|
242
|
+
{
|
|
243
|
+
// Our global has an nsISupports native pointer. Let's
|
|
244
|
+
// see whether it's what we want.
|
|
245
|
+
nsISupports* priv = (nsISupports*)xpc_GetJSPrivate(aGlobal);
|
|
246
|
+
nsCOMPtr<nsIXPConnectWrappedNative> native =
|
|
247
|
+
do_QueryInterface(priv);
|
|
248
|
+
if(native)
|
|
249
|
+
{
|
|
250
|
+
mScriptObjectPrincipal = do_QueryWrappedNative(native);
|
|
251
|
+
}
|
|
252
|
+
if(!mScriptObjectPrincipal)
|
|
253
|
+
{
|
|
254
|
+
mScriptObjectPrincipal = do_QueryInterface(priv);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
#endif
|
|
258
|
+
|
|
259
|
+
// Lookup 'globalObject.Object.prototype' for our wrapper's proto
|
|
260
|
+
{
|
|
261
|
+
AutoJSErrorAndExceptionEater eater(ccx); // scoped error eater
|
|
262
|
+
|
|
263
|
+
jsval val;
|
|
264
|
+
jsid idObj = mRuntime->GetStringID(XPCJSRuntime::IDX_OBJECT);
|
|
265
|
+
jsid idFun = mRuntime->GetStringID(XPCJSRuntime::IDX_FUNCTION);
|
|
266
|
+
jsid idProto = mRuntime->GetStringID(XPCJSRuntime::IDX_PROTOTYPE);
|
|
267
|
+
|
|
268
|
+
if(JS_GetPropertyById(ccx, aGlobal, idObj, &val) &&
|
|
269
|
+
!JSVAL_IS_PRIMITIVE(val) &&
|
|
270
|
+
JS_GetPropertyById(ccx, JSVAL_TO_OBJECT(val), idProto, &val) &&
|
|
271
|
+
!JSVAL_IS_PRIMITIVE(val))
|
|
272
|
+
{
|
|
273
|
+
mPrototypeJSObject = JSVAL_TO_OBJECT(val);
|
|
274
|
+
}
|
|
275
|
+
else
|
|
276
|
+
{
|
|
277
|
+
NS_ERROR("Can't get globalObject.Object.prototype");
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if(JS_GetPropertyById(ccx, aGlobal, idFun, &val) &&
|
|
281
|
+
!JSVAL_IS_PRIMITIVE(val) &&
|
|
282
|
+
JS_GetPropertyById(ccx, JSVAL_TO_OBJECT(val), idProto, &val) &&
|
|
283
|
+
!JSVAL_IS_PRIMITIVE(val))
|
|
284
|
+
{
|
|
285
|
+
mPrototypeJSFunction = JSVAL_TO_OBJECT(val);
|
|
286
|
+
}
|
|
287
|
+
else
|
|
288
|
+
{
|
|
289
|
+
NS_ERROR("Can't get globalObject.Function.prototype");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Clear the no helper wrapper prototype object so that a new one
|
|
294
|
+
// gets created if needed.
|
|
295
|
+
mPrototypeNoHelper = nsnull;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
XPCWrappedNativeScope::~XPCWrappedNativeScope()
|
|
299
|
+
{
|
|
300
|
+
MOZ_COUNT_DTOR(XPCWrappedNativeScope);
|
|
301
|
+
DEBUG_TrackDeleteScope(this);
|
|
302
|
+
|
|
303
|
+
// We can do additional cleanup assertions here...
|
|
304
|
+
|
|
305
|
+
if(mWrappedNativeMap)
|
|
306
|
+
{
|
|
307
|
+
NS_ASSERTION(0 == mWrappedNativeMap->Count(), "scope has non-empty map");
|
|
308
|
+
delete mWrappedNativeMap;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if(mWrappedNativeProtoMap)
|
|
312
|
+
{
|
|
313
|
+
NS_ASSERTION(0 == mWrappedNativeProtoMap->Count(), "scope has non-empty map");
|
|
314
|
+
delete mWrappedNativeProtoMap;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if(mWrapperMap)
|
|
318
|
+
{
|
|
319
|
+
NS_ASSERTION(0 == mWrapperMap->Count(), "scope has non-empty map");
|
|
320
|
+
delete mWrapperMap;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if(mContext)
|
|
324
|
+
mContext->RemoveScope(this);
|
|
325
|
+
|
|
326
|
+
// XXX we should assert that we are dead or that xpconnect has shutdown
|
|
327
|
+
// XXX might not want to do this at xpconnect shutdown time???
|
|
328
|
+
NS_IF_RELEASE(mComponents);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
JSObject *
|
|
332
|
+
XPCWrappedNativeScope::GetPrototypeNoHelper(XPCCallContext& ccx)
|
|
333
|
+
{
|
|
334
|
+
// We could create this prototype in SetGlobal(), but all scopes
|
|
335
|
+
// don't need one, so we save ourselves a bit of space if we
|
|
336
|
+
// create these when they're needed.
|
|
337
|
+
if(!mPrototypeNoHelper)
|
|
338
|
+
{
|
|
339
|
+
mPrototypeNoHelper =
|
|
340
|
+
xpc_NewSystemInheritingJSObject(ccx, &XPC_WN_NoHelper_Proto_JSClass,
|
|
341
|
+
mPrototypeJSObject,
|
|
342
|
+
mGlobalJSObject);
|
|
343
|
+
|
|
344
|
+
NS_ASSERTION(mPrototypeNoHelper,
|
|
345
|
+
"Failed to create prototype for wrappers w/o a helper");
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
return mPrototypeNoHelper;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
static JSDHashOperator
|
|
352
|
+
WrappedNativeJSGCThingTracer(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
353
|
+
uint32 number, void *arg)
|
|
354
|
+
{
|
|
355
|
+
XPCWrappedNative* wrapper = ((Native2WrappedNativeMap::Entry*)hdr)->value;
|
|
356
|
+
if(wrapper->HasExternalReference() && !wrapper->IsWrapperExpired())
|
|
357
|
+
{
|
|
358
|
+
JSTracer* trc = (JSTracer *)arg;
|
|
359
|
+
JS_CALL_OBJECT_TRACER(trc, wrapper->GetFlatJSObject(),
|
|
360
|
+
"XPCWrappedNative::mFlatJSObject");
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return JS_DHASH_NEXT;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// static
|
|
367
|
+
void
|
|
368
|
+
XPCWrappedNativeScope::TraceJS(JSTracer* trc, XPCJSRuntime* rt)
|
|
369
|
+
{
|
|
370
|
+
// FIXME The lock may not be necessary during tracing as that serializes
|
|
371
|
+
// access to JS runtime. See bug 380139.
|
|
372
|
+
XPCAutoLock lock(rt->GetMapLock());
|
|
373
|
+
|
|
374
|
+
// Do JS_CallTracer for all wrapped natives with external references.
|
|
375
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
376
|
+
{
|
|
377
|
+
cur->mWrappedNativeMap->Enumerate(WrappedNativeJSGCThingTracer, trc);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
struct SuspectClosure
|
|
382
|
+
{
|
|
383
|
+
SuspectClosure(JSContext *aCx, nsCycleCollectionTraversalCallback& aCb)
|
|
384
|
+
: cx(aCx), cb(aCb)
|
|
385
|
+
{
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
JSContext* cx;
|
|
389
|
+
nsCycleCollectionTraversalCallback& cb;
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
static JSDHashOperator
|
|
393
|
+
WrappedNativeSuspecter(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
394
|
+
uint32 number, void *arg)
|
|
395
|
+
{
|
|
396
|
+
SuspectClosure* closure = static_cast<SuspectClosure*>(arg);
|
|
397
|
+
XPCWrappedNative* wrapper = ((Native2WrappedNativeMap::Entry*)hdr)->value;
|
|
398
|
+
if(wrapper->IsValid())
|
|
399
|
+
{
|
|
400
|
+
NS_ASSERTION(NS_IsMainThread(),
|
|
401
|
+
"Suspecting wrapped natives from non-main thread");
|
|
402
|
+
|
|
403
|
+
#ifndef DEBUG_CC
|
|
404
|
+
// Only record objects that might be part of a cycle as roots.
|
|
405
|
+
if(!JS_IsAboutToBeFinalized(closure->cx, wrapper->GetFlatJSObject()))
|
|
406
|
+
return JS_DHASH_NEXT;
|
|
407
|
+
#endif
|
|
408
|
+
|
|
409
|
+
closure->cb.NoteRoot(nsIProgrammingLanguage::JAVASCRIPT,
|
|
410
|
+
wrapper->GetFlatJSObject(),
|
|
411
|
+
nsXPConnect::GetXPConnect());
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return JS_DHASH_NEXT;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// static
|
|
418
|
+
void
|
|
419
|
+
XPCWrappedNativeScope::SuspectAllWrappers(XPCJSRuntime* rt, JSContext* cx,
|
|
420
|
+
nsCycleCollectionTraversalCallback& cb)
|
|
421
|
+
{
|
|
422
|
+
XPCAutoLock lock(rt->GetMapLock());
|
|
423
|
+
|
|
424
|
+
SuspectClosure closure(cx, cb);
|
|
425
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
426
|
+
{
|
|
427
|
+
cur->mWrappedNativeMap->Enumerate(WrappedNativeSuspecter, &closure);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// static
|
|
432
|
+
void
|
|
433
|
+
XPCWrappedNativeScope::FinishedMarkPhaseOfGC(JSContext* cx, XPCJSRuntime* rt)
|
|
434
|
+
{
|
|
435
|
+
// FIXME The lock may not be necessary since we are inside JSGC_MARK_END
|
|
436
|
+
// callback and GX serializes access to JS runtime. See bug 380139.
|
|
437
|
+
XPCAutoLock lock(rt->GetMapLock());
|
|
438
|
+
|
|
439
|
+
// We are in JSGC_MARK_END and JSGC_FINALIZE_END must always follow it
|
|
440
|
+
// calling FinishedFinalizationPhaseOfGC and clearing gDyingScopes in
|
|
441
|
+
// KillDyingScopes.
|
|
442
|
+
NS_ASSERTION(gDyingScopes == nsnull,
|
|
443
|
+
"JSGC_MARK_END without JSGC_FINALIZE_END");
|
|
444
|
+
|
|
445
|
+
XPCWrappedNativeScope* prev = nsnull;
|
|
446
|
+
XPCWrappedNativeScope* cur = gScopes;
|
|
447
|
+
|
|
448
|
+
while(cur)
|
|
449
|
+
{
|
|
450
|
+
XPCWrappedNativeScope* next = cur->mNext;
|
|
451
|
+
if(cur->mGlobalJSObject &&
|
|
452
|
+
JS_IsAboutToBeFinalized(cx, cur->mGlobalJSObject))
|
|
453
|
+
{
|
|
454
|
+
cur->mGlobalJSObject = nsnull;
|
|
455
|
+
|
|
456
|
+
// Move this scope from the live list to the dying list.
|
|
457
|
+
if(prev)
|
|
458
|
+
prev->mNext = next;
|
|
459
|
+
else
|
|
460
|
+
gScopes = next;
|
|
461
|
+
cur->mNext = gDyingScopes;
|
|
462
|
+
gDyingScopes = cur;
|
|
463
|
+
cur = nsnull;
|
|
464
|
+
}
|
|
465
|
+
else
|
|
466
|
+
{
|
|
467
|
+
if(cur->mPrototypeJSObject &&
|
|
468
|
+
JS_IsAboutToBeFinalized(cx, cur->mPrototypeJSObject))
|
|
469
|
+
{
|
|
470
|
+
cur->mPrototypeJSObject = nsnull;
|
|
471
|
+
}
|
|
472
|
+
if(cur->mPrototypeJSFunction &&
|
|
473
|
+
JS_IsAboutToBeFinalized(cx, cur->mPrototypeJSFunction))
|
|
474
|
+
{
|
|
475
|
+
cur->mPrototypeJSFunction = nsnull;
|
|
476
|
+
}
|
|
477
|
+
if(cur->mPrototypeNoHelper &&
|
|
478
|
+
JS_IsAboutToBeFinalized(cx, cur->mPrototypeNoHelper))
|
|
479
|
+
{
|
|
480
|
+
cur->mPrototypeNoHelper = nsnull;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
if(cur)
|
|
484
|
+
prev = cur;
|
|
485
|
+
cur = next;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// static
|
|
490
|
+
void
|
|
491
|
+
XPCWrappedNativeScope::FinishedFinalizationPhaseOfGC(JSContext* cx)
|
|
492
|
+
{
|
|
493
|
+
XPCJSRuntime* rt = nsXPConnect::GetRuntimeInstance();
|
|
494
|
+
|
|
495
|
+
// FIXME The lock may not be necessary since we are inside
|
|
496
|
+
// JSGC_FINALIZE_END callback and at this point GC still serializes access
|
|
497
|
+
// to JS runtime. See bug 380139.
|
|
498
|
+
XPCAutoLock lock(rt->GetMapLock());
|
|
499
|
+
KillDyingScopes();
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
static JSDHashOperator
|
|
503
|
+
WrappedNativeMarker(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
504
|
+
uint32 number, void *arg)
|
|
505
|
+
{
|
|
506
|
+
((Native2WrappedNativeMap::Entry*)hdr)->value->Mark();
|
|
507
|
+
return JS_DHASH_NEXT;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// We need to explicitly mark all the protos too because some protos may be
|
|
511
|
+
// alive in the hashtable but not currently in use by any wrapper
|
|
512
|
+
static JSDHashOperator
|
|
513
|
+
WrappedNativeProtoMarker(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
514
|
+
uint32 number, void *arg)
|
|
515
|
+
{
|
|
516
|
+
((ClassInfo2WrappedNativeProtoMap::Entry*)hdr)->value->Mark();
|
|
517
|
+
return JS_DHASH_NEXT;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
// static
|
|
521
|
+
void
|
|
522
|
+
XPCWrappedNativeScope::MarkAllWrappedNativesAndProtos()
|
|
523
|
+
{
|
|
524
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
525
|
+
{
|
|
526
|
+
cur->mWrappedNativeMap->Enumerate(WrappedNativeMarker, nsnull);
|
|
527
|
+
cur->mWrappedNativeProtoMap->Enumerate(WrappedNativeProtoMarker, nsnull);
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
DEBUG_TrackScopeTraversal();
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
#ifdef DEBUG
|
|
534
|
+
static JSDHashOperator
|
|
535
|
+
ASSERT_WrappedNativeSetNotMarked(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
536
|
+
uint32 number, void *arg)
|
|
537
|
+
{
|
|
538
|
+
((Native2WrappedNativeMap::Entry*)hdr)->value->ASSERT_SetsNotMarked();
|
|
539
|
+
return JS_DHASH_NEXT;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
static JSDHashOperator
|
|
543
|
+
ASSERT_WrappedNativeProtoSetNotMarked(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
544
|
+
uint32 number, void *arg)
|
|
545
|
+
{
|
|
546
|
+
((ClassInfo2WrappedNativeProtoMap::Entry*)hdr)->value->ASSERT_SetNotMarked();
|
|
547
|
+
return JS_DHASH_NEXT;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// static
|
|
551
|
+
void
|
|
552
|
+
XPCWrappedNativeScope::ASSERT_NoInterfaceSetsAreMarked()
|
|
553
|
+
{
|
|
554
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
555
|
+
{
|
|
556
|
+
cur->mWrappedNativeMap->Enumerate(
|
|
557
|
+
ASSERT_WrappedNativeSetNotMarked, nsnull);
|
|
558
|
+
cur->mWrappedNativeProtoMap->Enumerate(
|
|
559
|
+
ASSERT_WrappedNativeProtoSetNotMarked, nsnull);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
#endif
|
|
563
|
+
|
|
564
|
+
static JSDHashOperator
|
|
565
|
+
WrappedNativeTearoffSweeper(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
566
|
+
uint32 number, void *arg)
|
|
567
|
+
{
|
|
568
|
+
((Native2WrappedNativeMap::Entry*)hdr)->value->SweepTearOffs();
|
|
569
|
+
return JS_DHASH_NEXT;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// static
|
|
573
|
+
void
|
|
574
|
+
XPCWrappedNativeScope::SweepAllWrappedNativeTearOffs()
|
|
575
|
+
{
|
|
576
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
577
|
+
cur->mWrappedNativeMap->Enumerate(WrappedNativeTearoffSweeper, nsnull);
|
|
578
|
+
|
|
579
|
+
DEBUG_TrackScopeTraversal();
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// static
|
|
583
|
+
void
|
|
584
|
+
XPCWrappedNativeScope::KillDyingScopes()
|
|
585
|
+
{
|
|
586
|
+
// always called inside the lock!
|
|
587
|
+
XPCWrappedNativeScope* cur = gDyingScopes;
|
|
588
|
+
while(cur)
|
|
589
|
+
{
|
|
590
|
+
XPCWrappedNativeScope* next = cur->mNext;
|
|
591
|
+
delete cur;
|
|
592
|
+
cur = next;
|
|
593
|
+
}
|
|
594
|
+
gDyingScopes = nsnull;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
struct ShutdownData
|
|
598
|
+
{
|
|
599
|
+
ShutdownData(JSContext* acx)
|
|
600
|
+
: cx(acx), wrapperCount(0),
|
|
601
|
+
sharedProtoCount(0), nonSharedProtoCount(0) {}
|
|
602
|
+
JSContext* cx;
|
|
603
|
+
int wrapperCount;
|
|
604
|
+
int sharedProtoCount;
|
|
605
|
+
int nonSharedProtoCount;
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
static JSDHashOperator
|
|
609
|
+
WrappedNativeShutdownEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
610
|
+
uint32 number, void *arg)
|
|
611
|
+
{
|
|
612
|
+
ShutdownData* data = (ShutdownData*) arg;
|
|
613
|
+
XPCWrappedNative* wrapper = ((Native2WrappedNativeMap::Entry*)hdr)->value;
|
|
614
|
+
|
|
615
|
+
if(wrapper->IsValid())
|
|
616
|
+
{
|
|
617
|
+
if(wrapper->HasProto() && !wrapper->HasSharedProto())
|
|
618
|
+
data->nonSharedProtoCount++;
|
|
619
|
+
wrapper->SystemIsBeingShutDown(data->cx);
|
|
620
|
+
data->wrapperCount++;
|
|
621
|
+
}
|
|
622
|
+
return JS_DHASH_REMOVE;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
static JSDHashOperator
|
|
626
|
+
WrappedNativeProtoShutdownEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
627
|
+
uint32 number, void *arg)
|
|
628
|
+
{
|
|
629
|
+
ShutdownData* data = (ShutdownData*) arg;
|
|
630
|
+
((ClassInfo2WrappedNativeProtoMap::Entry*)hdr)->value->
|
|
631
|
+
SystemIsBeingShutDown(data->cx);
|
|
632
|
+
data->sharedProtoCount++;
|
|
633
|
+
return JS_DHASH_REMOVE;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
//static
|
|
637
|
+
void
|
|
638
|
+
XPCWrappedNativeScope::SystemIsBeingShutDown(JSContext* cx)
|
|
639
|
+
{
|
|
640
|
+
DEBUG_TrackScopeTraversal();
|
|
641
|
+
DEBUG_TrackScopeShutdown();
|
|
642
|
+
|
|
643
|
+
int liveScopeCount = 0;
|
|
644
|
+
|
|
645
|
+
ShutdownData data(cx);
|
|
646
|
+
|
|
647
|
+
XPCWrappedNativeScope* cur;
|
|
648
|
+
|
|
649
|
+
// First move all the scopes to the dying list.
|
|
650
|
+
|
|
651
|
+
cur = gScopes;
|
|
652
|
+
while(cur)
|
|
653
|
+
{
|
|
654
|
+
XPCWrappedNativeScope* next = cur->mNext;
|
|
655
|
+
cur->mNext = gDyingScopes;
|
|
656
|
+
gDyingScopes = cur;
|
|
657
|
+
cur = next;
|
|
658
|
+
liveScopeCount++;
|
|
659
|
+
}
|
|
660
|
+
gScopes = nsnull;
|
|
661
|
+
|
|
662
|
+
// Walk the unified dying list and call shutdown on all wrappers and protos
|
|
663
|
+
|
|
664
|
+
for(cur = gDyingScopes; cur; cur = cur->mNext)
|
|
665
|
+
{
|
|
666
|
+
// Give the Components object a chance to try to clean up.
|
|
667
|
+
if(cur->mComponents)
|
|
668
|
+
cur->mComponents->SystemIsBeingShutDown();
|
|
669
|
+
|
|
670
|
+
// Walk the protos first. Wrapper shutdown can leave dangling
|
|
671
|
+
// proto pointers in the proto map.
|
|
672
|
+
cur->mWrappedNativeProtoMap->
|
|
673
|
+
Enumerate(WrappedNativeProtoShutdownEnumerator, &data);
|
|
674
|
+
cur->mWrappedNativeMap->
|
|
675
|
+
Enumerate(WrappedNativeShutdownEnumerator, &data);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// Now it is safe to kill all the scopes.
|
|
679
|
+
KillDyingScopes();
|
|
680
|
+
|
|
681
|
+
#ifdef XPC_DUMP_AT_SHUTDOWN
|
|
682
|
+
if(data.wrapperCount)
|
|
683
|
+
printf("deleting nsXPConnect with %d live XPCWrappedNatives\n",
|
|
684
|
+
data.wrapperCount);
|
|
685
|
+
if(data.sharedProtoCount + data.nonSharedProtoCount)
|
|
686
|
+
printf("deleting nsXPConnect with %d live XPCWrappedNativeProtos (%d shared)\n",
|
|
687
|
+
data.sharedProtoCount + data.nonSharedProtoCount,
|
|
688
|
+
data.sharedProtoCount);
|
|
689
|
+
if(liveScopeCount)
|
|
690
|
+
printf("deleting nsXPConnect with %d live XPCWrappedNativeScopes\n",
|
|
691
|
+
liveScopeCount);
|
|
692
|
+
#endif
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
|
|
696
|
+
/***************************************************************************/
|
|
697
|
+
|
|
698
|
+
static
|
|
699
|
+
XPCWrappedNativeScope*
|
|
700
|
+
GetScopeOfObject(JSObject* obj)
|
|
701
|
+
{
|
|
702
|
+
nsISupports* supports;
|
|
703
|
+
JSClass* clazz = STOBJ_GET_CLASS(obj);
|
|
704
|
+
|
|
705
|
+
if(!IS_WRAPPER_CLASS(clazz) ||
|
|
706
|
+
!(supports = (nsISupports*) xpc_GetJSPrivate(obj)))
|
|
707
|
+
{
|
|
708
|
+
#ifdef DEBUG
|
|
709
|
+
{
|
|
710
|
+
if(!(~clazz->flags & (JSCLASS_HAS_PRIVATE |
|
|
711
|
+
JSCLASS_PRIVATE_IS_NSISUPPORTS)) &&
|
|
712
|
+
(supports = (nsISupports*) xpc_GetJSPrivate(obj)) &&
|
|
713
|
+
!XPCNativeWrapper::IsNativeWrapperClass(clazz))
|
|
714
|
+
{
|
|
715
|
+
nsCOMPtr<nsIXPConnectWrappedNative> iface =
|
|
716
|
+
do_QueryInterface(supports);
|
|
717
|
+
|
|
718
|
+
NS_ASSERTION(!iface, "Uh, how'd this happen?");
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
#endif
|
|
722
|
+
|
|
723
|
+
return nsnull;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
#ifdef DEBUG
|
|
727
|
+
{
|
|
728
|
+
nsCOMPtr<nsIXPConnectWrappedNative> iface = do_QueryInterface(supports);
|
|
729
|
+
|
|
730
|
+
NS_ASSERTION(iface, "Uh, how'd this happen?");
|
|
731
|
+
}
|
|
732
|
+
#endif
|
|
733
|
+
|
|
734
|
+
// obj is one of our nsXPConnectWrappedNative objects.
|
|
735
|
+
return ((XPCWrappedNative*)supports)->GetScope();
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
#ifdef DEBUG
|
|
740
|
+
void DEBUG_CheckForComponentsInScope(JSContext* cx, JSObject* obj,
|
|
741
|
+
JSBool OKIfNotInitialized,
|
|
742
|
+
XPCJSRuntime* runtime)
|
|
743
|
+
{
|
|
744
|
+
if(OKIfNotInitialized)
|
|
745
|
+
return;
|
|
746
|
+
|
|
747
|
+
if(!(JS_GetOptions(cx) & JSOPTION_PRIVATE_IS_NSISUPPORTS))
|
|
748
|
+
return;
|
|
749
|
+
|
|
750
|
+
const char* name = runtime->GetStringName(XPCJSRuntime::IDX_COMPONENTS);
|
|
751
|
+
jsval prop;
|
|
752
|
+
if(JS_LookupProperty(cx, obj, name, &prop) && !JSVAL_IS_PRIMITIVE(prop))
|
|
753
|
+
return;
|
|
754
|
+
|
|
755
|
+
// This is pretty much always bad. It usually means that native code is
|
|
756
|
+
// making a callback to an interface implemented in JavaScript, but the
|
|
757
|
+
// document where the JS object was created has already been cleared and the
|
|
758
|
+
// global properties of that document's window are *gone*. Generally this
|
|
759
|
+
// indicates a problem that should be addressed in the design and use of the
|
|
760
|
+
// callback code.
|
|
761
|
+
#ifdef I_FOOLISHLY_WANT_TO_IGNORE_THIS_LIKE_THE_OTHER_CRAP_WE_PRINTF
|
|
762
|
+
NS_WARNING("XPConnect is being called on a scope without a 'Components' property!");
|
|
763
|
+
#else
|
|
764
|
+
NS_ERROR("XPConnect is being called on a scope without a 'Components' property!");
|
|
765
|
+
#endif
|
|
766
|
+
}
|
|
767
|
+
#else
|
|
768
|
+
#define DEBUG_CheckForComponentsInScope(ccx, obj, OKIfNotInitialized, runtime) \
|
|
769
|
+
((void)0)
|
|
770
|
+
#endif
|
|
771
|
+
|
|
772
|
+
// static
|
|
773
|
+
XPCWrappedNativeScope*
|
|
774
|
+
XPCWrappedNativeScope::FindInJSObjectScope(JSContext* cx, JSObject* obj,
|
|
775
|
+
JSBool OKIfNotInitialized,
|
|
776
|
+
XPCJSRuntime* runtime)
|
|
777
|
+
{
|
|
778
|
+
XPCWrappedNativeScope* scope;
|
|
779
|
+
|
|
780
|
+
if(!obj)
|
|
781
|
+
return nsnull;
|
|
782
|
+
|
|
783
|
+
// If this object is itself a wrapped native then we can get the
|
|
784
|
+
// scope directly.
|
|
785
|
+
|
|
786
|
+
scope = GetScopeOfObject(obj);
|
|
787
|
+
if(scope)
|
|
788
|
+
return scope;
|
|
789
|
+
|
|
790
|
+
// Else we'll have to look up the parent chain to get the scope
|
|
791
|
+
|
|
792
|
+
obj = JS_GetGlobalForObject(cx, obj);
|
|
793
|
+
|
|
794
|
+
if(!runtime)
|
|
795
|
+
{
|
|
796
|
+
runtime = nsXPConnect::GetRuntimeInstance();
|
|
797
|
+
NS_ASSERTION(runtime, "This should never be null!");
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
// XXX We are assuming that the scope count is low enough that traversing
|
|
801
|
+
// the linked list is more reasonable then doing a hashtable lookup.
|
|
802
|
+
XPCWrappedNativeScope* found = nsnull;
|
|
803
|
+
{ // scoped lock
|
|
804
|
+
XPCAutoLock lock(runtime->GetMapLock());
|
|
805
|
+
|
|
806
|
+
DEBUG_TrackScopeTraversal();
|
|
807
|
+
|
|
808
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
809
|
+
{
|
|
810
|
+
if(obj == cur->GetGlobalJSObject())
|
|
811
|
+
{
|
|
812
|
+
found = cur;
|
|
813
|
+
break;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
if(found) {
|
|
819
|
+
// This cannot be called within the map lock!
|
|
820
|
+
DEBUG_CheckForComponentsInScope(cx, obj, OKIfNotInitialized, runtime);
|
|
821
|
+
return found;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
// Failure to find the scope is only OK if the caller told us it might fail.
|
|
825
|
+
// This flag would only be set in the call from
|
|
826
|
+
// XPCWrappedNativeScope::GetNewOrUsed
|
|
827
|
+
NS_ASSERTION(OKIfNotInitialized, "No scope has this global object!");
|
|
828
|
+
return nsnull;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/***************************************************************************/
|
|
832
|
+
|
|
833
|
+
static JSDHashOperator
|
|
834
|
+
WNProtoSecPolicyClearer(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
835
|
+
uint32 number, void *arg)
|
|
836
|
+
{
|
|
837
|
+
XPCWrappedNativeProto* proto =
|
|
838
|
+
((ClassInfo2WrappedNativeProtoMap::Entry*)hdr)->value;
|
|
839
|
+
*(proto->GetSecurityInfoAddr()) = nsnull;
|
|
840
|
+
return JS_DHASH_NEXT;
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
static JSDHashOperator
|
|
844
|
+
WNSecPolicyClearer(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
845
|
+
uint32 number, void *arg)
|
|
846
|
+
{
|
|
847
|
+
XPCWrappedNative* wrapper = ((Native2WrappedNativeMap::Entry*)hdr)->value;
|
|
848
|
+
if(wrapper->HasProto() && !wrapper->HasSharedProto())
|
|
849
|
+
*(wrapper->GetProto()->GetSecurityInfoAddr()) = nsnull;
|
|
850
|
+
return JS_DHASH_NEXT;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// static
|
|
854
|
+
nsresult
|
|
855
|
+
XPCWrappedNativeScope::ClearAllWrappedNativeSecurityPolicies(XPCCallContext& ccx)
|
|
856
|
+
{
|
|
857
|
+
// Hold the lock throughout.
|
|
858
|
+
XPCAutoLock lock(ccx.GetRuntime()->GetMapLock());
|
|
859
|
+
|
|
860
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
861
|
+
{
|
|
862
|
+
cur->mWrappedNativeProtoMap->Enumerate(WNProtoSecPolicyClearer, nsnull);
|
|
863
|
+
cur->mWrappedNativeMap->Enumerate(WNSecPolicyClearer, nsnull);
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
DEBUG_TrackScopeTraversal();
|
|
867
|
+
|
|
868
|
+
return NS_OK;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
static JSDHashOperator
|
|
872
|
+
WNProtoRemover(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
873
|
+
uint32 number, void *arg)
|
|
874
|
+
{
|
|
875
|
+
XPCWrappedNativeProtoMap* detachedMap = (XPCWrappedNativeProtoMap*)arg;
|
|
876
|
+
|
|
877
|
+
XPCWrappedNativeProto* proto = (XPCWrappedNativeProto*)
|
|
878
|
+
((ClassInfo2WrappedNativeProtoMap::Entry*)hdr)->value;
|
|
879
|
+
|
|
880
|
+
detachedMap->Add(proto);
|
|
881
|
+
|
|
882
|
+
return JS_DHASH_REMOVE;
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
void
|
|
886
|
+
XPCWrappedNativeScope::RemoveWrappedNativeProtos()
|
|
887
|
+
{
|
|
888
|
+
XPCAutoLock al(mRuntime->GetMapLock());
|
|
889
|
+
|
|
890
|
+
mWrappedNativeProtoMap->Enumerate(WNProtoRemover,
|
|
891
|
+
GetRuntime()->GetDetachedWrappedNativeProtoMap());
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
/***************************************************************************/
|
|
895
|
+
|
|
896
|
+
// static
|
|
897
|
+
void
|
|
898
|
+
XPCWrappedNativeScope::DebugDumpAllScopes(PRInt16 depth)
|
|
899
|
+
{
|
|
900
|
+
#ifdef DEBUG
|
|
901
|
+
depth-- ;
|
|
902
|
+
|
|
903
|
+
// get scope count.
|
|
904
|
+
int count = 0;
|
|
905
|
+
XPCWrappedNativeScope* cur;
|
|
906
|
+
for(cur = gScopes; cur; cur = cur->mNext)
|
|
907
|
+
count++ ;
|
|
908
|
+
|
|
909
|
+
XPC_LOG_ALWAYS(("chain of %d XPCWrappedNativeScope(s)", count));
|
|
910
|
+
XPC_LOG_INDENT();
|
|
911
|
+
XPC_LOG_ALWAYS(("gDyingScopes @ %x", gDyingScopes));
|
|
912
|
+
if(depth)
|
|
913
|
+
for(cur = gScopes; cur; cur = cur->mNext)
|
|
914
|
+
cur->DebugDump(depth);
|
|
915
|
+
XPC_LOG_OUTDENT();
|
|
916
|
+
#endif
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
#ifdef DEBUG
|
|
920
|
+
static JSDHashOperator
|
|
921
|
+
WrappedNativeMapDumpEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
922
|
+
uint32 number, void *arg)
|
|
923
|
+
{
|
|
924
|
+
((Native2WrappedNativeMap::Entry*)hdr)->value->DebugDump(*(PRInt16*)arg);
|
|
925
|
+
return JS_DHASH_NEXT;
|
|
926
|
+
}
|
|
927
|
+
static JSDHashOperator
|
|
928
|
+
WrappedNativeProtoMapDumpEnumerator(JSDHashTable *table, JSDHashEntryHdr *hdr,
|
|
929
|
+
uint32 number, void *arg)
|
|
930
|
+
{
|
|
931
|
+
((ClassInfo2WrappedNativeProtoMap::Entry*)hdr)->value->DebugDump(*(PRInt16*)arg);
|
|
932
|
+
return JS_DHASH_NEXT;
|
|
933
|
+
}
|
|
934
|
+
#endif
|
|
935
|
+
|
|
936
|
+
void
|
|
937
|
+
XPCWrappedNativeScope::DebugDump(PRInt16 depth)
|
|
938
|
+
{
|
|
939
|
+
#ifdef DEBUG
|
|
940
|
+
depth-- ;
|
|
941
|
+
XPC_LOG_ALWAYS(("XPCWrappedNativeScope @ %x", this));
|
|
942
|
+
XPC_LOG_INDENT();
|
|
943
|
+
XPC_LOG_ALWAYS(("mRuntime @ %x", mRuntime));
|
|
944
|
+
XPC_LOG_ALWAYS(("mNext @ %x", mNext));
|
|
945
|
+
XPC_LOG_ALWAYS(("mComponents @ %x", mComponents));
|
|
946
|
+
XPC_LOG_ALWAYS(("mGlobalJSObject @ %x", mGlobalJSObject));
|
|
947
|
+
XPC_LOG_ALWAYS(("mPrototypeJSObject @ %x", mPrototypeJSObject));
|
|
948
|
+
XPC_LOG_ALWAYS(("mPrototypeJSFunction @ %x", mPrototypeJSFunction));
|
|
949
|
+
XPC_LOG_ALWAYS(("mPrototypeNoHelper @ %x", mPrototypeNoHelper));
|
|
950
|
+
|
|
951
|
+
XPC_LOG_ALWAYS(("mWrappedNativeMap @ %x with %d wrappers(s)", \
|
|
952
|
+
mWrappedNativeMap, \
|
|
953
|
+
mWrappedNativeMap ? mWrappedNativeMap->Count() : 0));
|
|
954
|
+
// iterate contexts...
|
|
955
|
+
if(depth && mWrappedNativeMap && mWrappedNativeMap->Count())
|
|
956
|
+
{
|
|
957
|
+
XPC_LOG_INDENT();
|
|
958
|
+
mWrappedNativeMap->Enumerate(WrappedNativeMapDumpEnumerator, &depth);
|
|
959
|
+
XPC_LOG_OUTDENT();
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
XPC_LOG_ALWAYS(("mWrappedNativeProtoMap @ %x with %d protos(s)", \
|
|
963
|
+
mWrappedNativeProtoMap, \
|
|
964
|
+
mWrappedNativeProtoMap ? mWrappedNativeProtoMap->Count() : 0));
|
|
965
|
+
// iterate contexts...
|
|
966
|
+
if(depth && mWrappedNativeProtoMap && mWrappedNativeProtoMap->Count())
|
|
967
|
+
{
|
|
968
|
+
XPC_LOG_INDENT();
|
|
969
|
+
mWrappedNativeProtoMap->Enumerate(WrappedNativeProtoMapDumpEnumerator, &depth);
|
|
970
|
+
XPC_LOG_OUTDENT();
|
|
971
|
+
}
|
|
972
|
+
XPC_LOG_OUTDENT();
|
|
973
|
+
#endif
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
#ifndef XPCONNECT_STANDALONE
|
|
977
|
+
// static
|
|
978
|
+
void
|
|
979
|
+
XPCWrappedNativeScope::TraverseScopes(XPCCallContext& ccx)
|
|
980
|
+
{
|
|
981
|
+
// Hold the lock throughout.
|
|
982
|
+
XPCAutoLock lock(ccx.GetRuntime()->GetMapLock());
|
|
983
|
+
|
|
984
|
+
for(XPCWrappedNativeScope* cur = gScopes; cur; cur = cur->mNext)
|
|
985
|
+
if(cur->mGlobalJSObject && cur->mScriptObjectPrincipal)
|
|
986
|
+
{
|
|
987
|
+
ccx.GetXPConnect()->RecordTraversal(cur->mGlobalJSObject,
|
|
988
|
+
cur->mScriptObjectPrincipal);
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
#endif
|