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,1487 @@
|
|
|
1
|
+
#!/usr/bin/env/python
|
|
2
|
+
# qsgen.py - Generate XPConnect quick stubs.
|
|
3
|
+
#
|
|
4
|
+
# ***** BEGIN LICENSE BLOCK *****
|
|
5
|
+
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
6
|
+
#
|
|
7
|
+
# The contents of this file are subject to the Mozilla Public License Version
|
|
8
|
+
# 1.1 (the "License"); you may not use this file except in compliance with
|
|
9
|
+
# the License. You may obtain a copy of the License at
|
|
10
|
+
# http://www.mozilla.org/MPL/
|
|
11
|
+
#
|
|
12
|
+
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
13
|
+
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
14
|
+
# for the specific language governing rights and limitations under the
|
|
15
|
+
# License.
|
|
16
|
+
#
|
|
17
|
+
# The Original Code is mozilla.org code.
|
|
18
|
+
#
|
|
19
|
+
# The Initial Developer of the Original Code is
|
|
20
|
+
# Mozilla Foundation.
|
|
21
|
+
# Portions created by the Initial Developer are Copyright (C) 2008
|
|
22
|
+
# the Initial Developer. All Rights Reserved.
|
|
23
|
+
#
|
|
24
|
+
# Contributor(s):
|
|
25
|
+
# Jason Orendorff <jorendorff@mozilla.com>
|
|
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
|
+
# =About quick stubs=
|
|
42
|
+
# qsgen.py generates "quick stubs", custom SpiderMonkey getters, setters, and
|
|
43
|
+
# methods for specified XPCOM interface members. These quick stubs serve at
|
|
44
|
+
# runtime as replacements for the XPConnect functions XPC_WN_GetterSetter and
|
|
45
|
+
# XPC_WN_CallMethod, which are the extremely generic (and slow) SpiderMonkey
|
|
46
|
+
# getter/setter/methods otherwise used for all XPCOM member accesses from JS.
|
|
47
|
+
#
|
|
48
|
+
# There are two ways quick stubs win:
|
|
49
|
+
# 1. Pure, transparent optimization by partial evaluation.
|
|
50
|
+
# 2. Cutting corners.
|
|
51
|
+
#
|
|
52
|
+
# == Partial evaluation ==
|
|
53
|
+
# Partial evaluation is when you execute part of a program early (before or at
|
|
54
|
+
# compile time) so that you don't have to execute it at run time. In this
|
|
55
|
+
# case, everything that involves interpreting xptcall data (for example, the
|
|
56
|
+
# big methodInfo loops in XPCWrappedNative::CallMethod and the switch statement
|
|
57
|
+
# in XPCConert::JSData2Native) might as well happen at build time, since all
|
|
58
|
+
# the type information for any given member is already known. That's what this
|
|
59
|
+
# script does. It gets the information from IDL instead of XPT files. Apart
|
|
60
|
+
# from that, the code in this script is very similar to what you'll find in
|
|
61
|
+
# XPConnect itself. The advantage is that it runs once, at build time, not in
|
|
62
|
+
# tight loops at run time.
|
|
63
|
+
#
|
|
64
|
+
# == Cutting corners ==
|
|
65
|
+
# The XPConnect versions have to be slow because they do tons of work that's
|
|
66
|
+
# only necessary in a few cases. The quick stubs skip a lot of that work. So
|
|
67
|
+
# quick stubs necessarily differ from XPConnect in potentially observable ways.
|
|
68
|
+
# For many specific interface members, the differences are not observable from
|
|
69
|
+
# scripts or don't matter enough to worry about; but you do have to be careful
|
|
70
|
+
# which members you decide to generate quick stubs for.
|
|
71
|
+
#
|
|
72
|
+
# The complete list of known differences, as of this writing, after an
|
|
73
|
+
# assiduous search:
|
|
74
|
+
#
|
|
75
|
+
# - Quick stubs affect the handling of naming conflicts--that is, which C++
|
|
76
|
+
# method gets called when a script uses an XPCOM feature that is declared in
|
|
77
|
+
# more than one of the interfaces the object implements. Without quick
|
|
78
|
+
# stubs, XPConnect just walks the interfaces in the order they're listed by
|
|
79
|
+
# nsClassInfo. You get the first interface that implements a feature with
|
|
80
|
+
# that name. With quick stubs, it's the same except that non-quick-stubbed
|
|
81
|
+
# features are shadowed.
|
|
82
|
+
#
|
|
83
|
+
# - Quick stub methods are JSFastNative, which means that when a quick stub
|
|
84
|
+
# method is called, no JS stack frame is created. This doesn't affect
|
|
85
|
+
# Mozilla security checks because they look for scripted JSStackFrames, not
|
|
86
|
+
# native ones.
|
|
87
|
+
#
|
|
88
|
+
# It does affect the 'stack' property of JavaScript exceptions, though: the
|
|
89
|
+
# stubbed member will not appear. (Note that if the stubbed member itself
|
|
90
|
+
# fails, the member name will appear in the 'message' property.)
|
|
91
|
+
#
|
|
92
|
+
# - Many quick stubs don't create an XPCCallContext. In those cases, no entry
|
|
93
|
+
# is added to the XPCCallContext stack. So native implementations of
|
|
94
|
+
# quick-stubbed methods must avoid nsXPConnect::GetCurrentNativeCallContext.
|
|
95
|
+
#
|
|
96
|
+
# (Even when a quick stub does have an XPCCallContext, it never pushes it all
|
|
97
|
+
# the way to READY_TO_CALL state, so a lot of its members are garbage. But
|
|
98
|
+
# this doesn't endanger native implementations of non-quick-stubbed methods
|
|
99
|
+
# that use GetCurrentNativeCallContext and are called indirectly from
|
|
100
|
+
# quick-stubbed methods, because only the current top XPCCallContext is
|
|
101
|
+
# exposed--nsAXPCNativeCallContext does not expose
|
|
102
|
+
# XPCCallContext::GetPrevCallContext.)
|
|
103
|
+
#
|
|
104
|
+
# - There are a few differences in how the "this" JSObject is unwrapped.
|
|
105
|
+
# Ordinarily, XPConnect searches the prototype chain of the "this" JSObject
|
|
106
|
+
# for an XPCOM object of the desired "proto". For details, see the parts of
|
|
107
|
+
# XPCWrappedNative::GetWrappedNativeOfJSObject that use "proto". Some quick
|
|
108
|
+
# stubs (methods, not getters or setters, that have XPCCallContexts) do this,
|
|
109
|
+
# but most instead look for an XPCOM object that supports the desired
|
|
110
|
+
# *interface*. This is more lenient. The difference is observable in some
|
|
111
|
+
# cases where a getter/setter/method is taken from one object and applied to
|
|
112
|
+
# another object.
|
|
113
|
+
#
|
|
114
|
+
# - Quick stubs never suspend the JS request. So they are only suitable for
|
|
115
|
+
# main-thread-only interfaces.
|
|
116
|
+
#
|
|
117
|
+
# - Quick stubs don't call XPCContext::SetLastResult. This is visible on the
|
|
118
|
+
# Components object.
|
|
119
|
+
#
|
|
120
|
+
# - Quick stubs skip a security check that XPConnect does in
|
|
121
|
+
# XPCWrappedNative::CallMethod. This means the security manager doesn't have
|
|
122
|
+
# an opportunity to veto accesses to members for which quick stubs exist.
|
|
123
|
+
#
|
|
124
|
+
# - There are many features of IDL that XPConnect supports but qsgen does not,
|
|
125
|
+
# including dependent types, arrays, and out parameters.
|
|
126
|
+
#
|
|
127
|
+
# - Since quick stubs are JSPropertyOps, we have to do additional work to make
|
|
128
|
+
# __lookup[GS]etter__ work on them.
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
import xpidl
|
|
132
|
+
import header
|
|
133
|
+
import os, re
|
|
134
|
+
import sys
|
|
135
|
+
import sets
|
|
136
|
+
|
|
137
|
+
# === Preliminaries
|
|
138
|
+
|
|
139
|
+
# --makedepend-output support.
|
|
140
|
+
make_dependencies = []
|
|
141
|
+
make_targets = []
|
|
142
|
+
|
|
143
|
+
def warn(msg):
|
|
144
|
+
sys.stderr.write(msg + '\n')
|
|
145
|
+
|
|
146
|
+
def unaliasType(t):
|
|
147
|
+
while t.kind == 'typedef':
|
|
148
|
+
t = t.realtype
|
|
149
|
+
assert t is not None
|
|
150
|
+
return t
|
|
151
|
+
|
|
152
|
+
def isVoidType(type):
|
|
153
|
+
""" Return True if the given xpidl type is void. """
|
|
154
|
+
return type.kind == 'builtin' and type.name == 'void'
|
|
155
|
+
|
|
156
|
+
def isInterfaceType(t):
|
|
157
|
+
t = unaliasType(t)
|
|
158
|
+
assert t.kind in ('builtin', 'native', 'interface', 'forward')
|
|
159
|
+
return t.kind in ('interface', 'forward')
|
|
160
|
+
|
|
161
|
+
def isSpecificInterfaceType(t, name):
|
|
162
|
+
""" True if `t` is an interface type with the given name, or a forward
|
|
163
|
+
declaration or typedef aliasing it.
|
|
164
|
+
|
|
165
|
+
`name` must not be the name of a typedef but the actual name of the
|
|
166
|
+
interface.
|
|
167
|
+
"""
|
|
168
|
+
t = unaliasType(t)
|
|
169
|
+
return t.kind in ('interface', 'forward') and t.name == name
|
|
170
|
+
|
|
171
|
+
def getBuiltinOrNativeTypeName(t):
|
|
172
|
+
t = unaliasType(t)
|
|
173
|
+
if t.kind == 'builtin':
|
|
174
|
+
return t.name
|
|
175
|
+
elif t.kind == 'native':
|
|
176
|
+
assert t.specialtype is not None
|
|
177
|
+
return '[%s]' % t.specialtype
|
|
178
|
+
else:
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
# === Reading the file
|
|
183
|
+
|
|
184
|
+
class UserError(Exception):
|
|
185
|
+
pass
|
|
186
|
+
|
|
187
|
+
def findIDL(includePath, irregularFilenames, interfaceName):
|
|
188
|
+
filename = irregularFilenames.get(interfaceName, interfaceName) + '.idl'
|
|
189
|
+
for d in includePath:
|
|
190
|
+
# Not os.path.join: we need a forward slash even on Windows because
|
|
191
|
+
# this filename ends up in makedepend output.
|
|
192
|
+
path = d + '/' + filename
|
|
193
|
+
if os.path.exists(path):
|
|
194
|
+
return path
|
|
195
|
+
raise UserError("No IDL file found for interface %s "
|
|
196
|
+
"in include path %r"
|
|
197
|
+
% (interfaceName, includePath))
|
|
198
|
+
|
|
199
|
+
def loadIDL(parser, includePath, filename):
|
|
200
|
+
make_dependencies.append(filename)
|
|
201
|
+
text = open(filename, 'r').read()
|
|
202
|
+
idl = parser.parse(text, filename=filename)
|
|
203
|
+
idl.resolve(includePath, parser)
|
|
204
|
+
return idl
|
|
205
|
+
|
|
206
|
+
def addStubMember(memberId, member, traceable):
|
|
207
|
+
# Check that the member is ok.
|
|
208
|
+
mayTrace = False
|
|
209
|
+
if member.kind not in ('method', 'attribute'):
|
|
210
|
+
raise UserError("Member %s is %r, not a method or attribute."
|
|
211
|
+
% (memberId, member.kind))
|
|
212
|
+
if member.noscript:
|
|
213
|
+
raise UserError("%s %s is noscript."
|
|
214
|
+
% (member.kind.capitalize(), memberId))
|
|
215
|
+
if member.notxpcom:
|
|
216
|
+
raise UserError(
|
|
217
|
+
"%s %s: notxpcom methods are not supported."
|
|
218
|
+
% (member.kind.capitalize(), memberId))
|
|
219
|
+
|
|
220
|
+
if (member.kind == 'attribute'
|
|
221
|
+
and not member.readonly
|
|
222
|
+
and isSpecificInterfaceType(member.realtype, 'nsIVariant')):
|
|
223
|
+
raise UserError(
|
|
224
|
+
"Attribute %s: Non-readonly attributes of type nsIVariant "
|
|
225
|
+
"are not supported."
|
|
226
|
+
% memberId)
|
|
227
|
+
|
|
228
|
+
# Check for unknown properties.
|
|
229
|
+
for attrname, value in vars(member).items():
|
|
230
|
+
if value is True and attrname not in ('readonly',):
|
|
231
|
+
raise UserError("%s %s: unrecognized property %r"
|
|
232
|
+
% (member.kind.capitalize(), memberId,
|
|
233
|
+
attrname))
|
|
234
|
+
if member.kind == 'method':
|
|
235
|
+
for param in member.params:
|
|
236
|
+
for attrname, value in vars(param).items():
|
|
237
|
+
if value is True and attrname not in ('optional',):
|
|
238
|
+
raise UserError("Method %s, parameter %s: "
|
|
239
|
+
"unrecognized property %r"
|
|
240
|
+
% (memberId, param.name, attrname))
|
|
241
|
+
if len(member.params) <= 3:
|
|
242
|
+
mayTrace = True
|
|
243
|
+
|
|
244
|
+
member.traceable = traceable and mayTrace
|
|
245
|
+
|
|
246
|
+
# Add this member to the list.
|
|
247
|
+
member.iface.stubMembers.append(member)
|
|
248
|
+
|
|
249
|
+
def parseMemberId(memberId):
|
|
250
|
+
""" Split the geven member id into its parts. """
|
|
251
|
+
pieces = memberId.split('.')
|
|
252
|
+
if len(pieces) < 2:
|
|
253
|
+
raise UserError("Member %r: Missing dot." % memberId)
|
|
254
|
+
if len(pieces) > 2:
|
|
255
|
+
raise UserError("Member %r: Dots out of control." % memberId)
|
|
256
|
+
return tuple(pieces)
|
|
257
|
+
|
|
258
|
+
class Configuration:
|
|
259
|
+
def __init__(self, filename, includePath):
|
|
260
|
+
self.includePath = includePath
|
|
261
|
+
config = {}
|
|
262
|
+
execfile(filename, config)
|
|
263
|
+
# required settings
|
|
264
|
+
for name in ('name', 'members'):
|
|
265
|
+
if name not in config:
|
|
266
|
+
raise UserError(filename + ": `%s` was not defined." % name)
|
|
267
|
+
setattr(self, name, config[name])
|
|
268
|
+
# optional settings
|
|
269
|
+
self.irregularFilenames = config.get('irregularFilenames', {})
|
|
270
|
+
self.customIncludes = config.get('customIncludes', [])
|
|
271
|
+
self.customMethodCalls = config.get('customMethodCalls', {})
|
|
272
|
+
|
|
273
|
+
def readConfigFile(filename, includePath, cachedir, traceable):
|
|
274
|
+
# Read the config file.
|
|
275
|
+
conf = Configuration(filename, includePath)
|
|
276
|
+
|
|
277
|
+
# Now read IDL files to connect the information in the config file to
|
|
278
|
+
# actual XPCOM interfaces, methods, and attributes.
|
|
279
|
+
interfaces = []
|
|
280
|
+
interfacesByName = {}
|
|
281
|
+
parser = xpidl.IDLParser(cachedir)
|
|
282
|
+
|
|
283
|
+
def getInterface(interfaceName, errorLoc):
|
|
284
|
+
iface = interfacesByName.get(interfaceName)
|
|
285
|
+
if iface is None:
|
|
286
|
+
idlFile = findIDL(conf.includePath, conf.irregularFilenames,
|
|
287
|
+
interfaceName)
|
|
288
|
+
idl = loadIDL(parser, conf.includePath, idlFile)
|
|
289
|
+
if not idl.hasName(interfaceName):
|
|
290
|
+
raise UserError("The interface %s was not found "
|
|
291
|
+
"in the idl file %r."
|
|
292
|
+
% (interfaceName, idlFile))
|
|
293
|
+
iface = idl.getName(interfaceName, errorLoc)
|
|
294
|
+
iface.stubMembers = []
|
|
295
|
+
interfaces.append(iface)
|
|
296
|
+
interfacesByName[interfaceName] = iface
|
|
297
|
+
return iface
|
|
298
|
+
|
|
299
|
+
for memberId in conf.members:
|
|
300
|
+
interfaceName, memberName = parseMemberId(memberId)
|
|
301
|
+
iface = getInterface(interfaceName, errorLoc='looking for %r' % memberId)
|
|
302
|
+
|
|
303
|
+
if not iface.attributes.scriptable:
|
|
304
|
+
raise UserError("Interface %s is not scriptable. "
|
|
305
|
+
"IDL file: %r." % (interfaceName, idlFile))
|
|
306
|
+
|
|
307
|
+
if memberName == '*':
|
|
308
|
+
# Stub all scriptable members of this interface.
|
|
309
|
+
for member in iface.members:
|
|
310
|
+
if member.kind in ('method', 'attribute') and not member.noscript:
|
|
311
|
+
addStubMember(iface.name + '.' + member.name, member,
|
|
312
|
+
traceable)
|
|
313
|
+
else:
|
|
314
|
+
# Look up a member by name.
|
|
315
|
+
if memberName not in iface.namemap:
|
|
316
|
+
idlFile = iface.idl.parser.lexer.filename
|
|
317
|
+
raise UserError("Interface %s has no member %r. "
|
|
318
|
+
"(See IDL file %r.)"
|
|
319
|
+
% (interfaceName, memberName, idlFile))
|
|
320
|
+
member = iface.namemap.get(memberName, None)
|
|
321
|
+
if member in iface.stubMembers:
|
|
322
|
+
raise UserError("Member %s is specified more than once."
|
|
323
|
+
% memberId)
|
|
324
|
+
addStubMember(memberId, member, traceable)
|
|
325
|
+
|
|
326
|
+
return conf, interfaces
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
# === Generating the header file
|
|
330
|
+
|
|
331
|
+
def writeHeaderFile(filename, name):
|
|
332
|
+
print "Creating header file", filename
|
|
333
|
+
make_targets.append(filename)
|
|
334
|
+
|
|
335
|
+
headerMacro = '__gen_%s__' % filename.replace('.', '_')
|
|
336
|
+
f = open(filename, 'w')
|
|
337
|
+
try:
|
|
338
|
+
f.write("/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */\n"
|
|
339
|
+
"#ifndef " + headerMacro + "\n"
|
|
340
|
+
"#define " + headerMacro + "\n\n"
|
|
341
|
+
"JSBool " + name + "_DefineQuickStubs("
|
|
342
|
+
"JSContext *cx, JSObject *proto, uintN flags, "
|
|
343
|
+
"PRUint32 count, const nsID **iids);\n\n"
|
|
344
|
+
"void " + name + "_MarkInterfaces();\n\n"
|
|
345
|
+
"void " + name + "_ClearInterfaces();\n\n"
|
|
346
|
+
"inline void " + name + "_InitInterfaces()\n"
|
|
347
|
+
"{\n"
|
|
348
|
+
" " + name + "_ClearInterfaces();\n"
|
|
349
|
+
"}\n\n"
|
|
350
|
+
"#endif\n")
|
|
351
|
+
finally:
|
|
352
|
+
f.close()
|
|
353
|
+
|
|
354
|
+
# === Generating the source file
|
|
355
|
+
|
|
356
|
+
def substitute(template, vals):
|
|
357
|
+
""" Simple replacement for string.Template, which isn't in Python 2.3. """
|
|
358
|
+
def replacement(match):
|
|
359
|
+
return vals[match.group(1)]
|
|
360
|
+
return re.sub(r'\${(\w+)}', replacement, template)
|
|
361
|
+
|
|
362
|
+
# From JSData2Native.
|
|
363
|
+
argumentUnboxingTemplates = {
|
|
364
|
+
'short':
|
|
365
|
+
" int32 ${name}_i32;\n"
|
|
366
|
+
" if (!JS_ValueToECMAInt32(cx, ${argVal}, &${name}_i32))\n"
|
|
367
|
+
" return JS_FALSE;\n"
|
|
368
|
+
" int16 ${name} = (int16) ${name}_i32;\n",
|
|
369
|
+
|
|
370
|
+
'unsigned short':
|
|
371
|
+
" uint32 ${name}_u32;\n"
|
|
372
|
+
" if (!JS_ValueToECMAUint32(cx, ${argVal}, &${name}_u32))\n"
|
|
373
|
+
" return JS_FALSE;\n"
|
|
374
|
+
" uint16 ${name} = (uint16) ${name}_u32;\n",
|
|
375
|
+
|
|
376
|
+
'long':
|
|
377
|
+
" int32 ${name};\n"
|
|
378
|
+
" if (!JS_ValueToECMAInt32(cx, ${argVal}, &${name}))\n"
|
|
379
|
+
" return JS_FALSE;\n",
|
|
380
|
+
|
|
381
|
+
'unsigned long':
|
|
382
|
+
" uint32 ${name};\n"
|
|
383
|
+
" if (!JS_ValueToECMAUint32(cx, ${argVal}, &${name}))\n"
|
|
384
|
+
" return JS_FALSE;\n",
|
|
385
|
+
|
|
386
|
+
'float':
|
|
387
|
+
" jsdouble ${name}_dbl;\n"
|
|
388
|
+
" if (!JS_ValueToNumber(cx, ${argVal}, &${name}_dbl))\n"
|
|
389
|
+
" return JS_FALSE;\n"
|
|
390
|
+
" float ${name} = (float) ${name}_dbl;\n",
|
|
391
|
+
|
|
392
|
+
'double':
|
|
393
|
+
" jsdouble ${name};\n"
|
|
394
|
+
" if (!JS_ValueToNumber(cx, ${argVal}, &${name}))\n"
|
|
395
|
+
" return JS_FALSE;\n",
|
|
396
|
+
|
|
397
|
+
'boolean':
|
|
398
|
+
" PRBool ${name};\n"
|
|
399
|
+
" if (!JS_ValueToBoolean(cx, ${argVal}, &${name}))\n"
|
|
400
|
+
" return JS_FALSE;\n",
|
|
401
|
+
|
|
402
|
+
'[astring]':
|
|
403
|
+
" xpc_qsAString ${name}(cx, ${argPtr});\n"
|
|
404
|
+
" if (!${name}.IsValid())\n"
|
|
405
|
+
" return JS_FALSE;\n",
|
|
406
|
+
|
|
407
|
+
'[domstring]':
|
|
408
|
+
" xpc_qsDOMString ${name}(cx, ${argPtr});\n"
|
|
409
|
+
" if (!${name}.IsValid())\n"
|
|
410
|
+
" return JS_FALSE;\n",
|
|
411
|
+
|
|
412
|
+
'string':
|
|
413
|
+
" char *${name};\n"
|
|
414
|
+
" if (!xpc_qsJsvalToCharStr(cx, ${argPtr}, &${name}))\n"
|
|
415
|
+
" return JS_FALSE;\n",
|
|
416
|
+
|
|
417
|
+
'wstring':
|
|
418
|
+
" PRUnichar *${name};\n"
|
|
419
|
+
" if (!xpc_qsJsvalToWcharStr(cx, ${argPtr}, &${name}))\n"
|
|
420
|
+
" return JS_FALSE;\n",
|
|
421
|
+
|
|
422
|
+
'[cstring]':
|
|
423
|
+
" xpc_qsACString ${name}(cx, ${argPtr});\n"
|
|
424
|
+
" if (!${name}.IsValid())\n"
|
|
425
|
+
" return JS_FALSE;\n"
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
# From JSData2Native.
|
|
429
|
+
#
|
|
430
|
+
# Omitted optional arguments are treated as though the caller had passed JS
|
|
431
|
+
# `null`; this behavior is from XPCWrappedNative::CallMethod.
|
|
432
|
+
#
|
|
433
|
+
def writeArgumentUnboxing(f, i, name, type, haveCcx, optional, rvdeclared):
|
|
434
|
+
# f - file to write to
|
|
435
|
+
# i - int or None - Indicates the source jsval. If i is an int, the source
|
|
436
|
+
# jsval is argv[i]; otherwise it is *vp. But if Python i >= C++ argc,
|
|
437
|
+
# which can only happen if optional is True, the argument is missing;
|
|
438
|
+
# use JSVAL_NULL as the source jsval instead.
|
|
439
|
+
# name - str - name of the native C++ variable to create.
|
|
440
|
+
# type - xpidl.{Interface,Native,Builtin} - IDL type of argument
|
|
441
|
+
# optional - bool - True if the parameter is optional.
|
|
442
|
+
# rvdeclared - bool - False if no |nsresult rv| has been declared earlier.
|
|
443
|
+
|
|
444
|
+
isSetter = (i is None)
|
|
445
|
+
|
|
446
|
+
if isSetter:
|
|
447
|
+
argPtr = "vp"
|
|
448
|
+
argVal = "*vp"
|
|
449
|
+
elif optional:
|
|
450
|
+
argPtr = '! /* TODO - optional parameter of this type not supported */'
|
|
451
|
+
argVal = "(%d < argc ? argv[%d] : JSVAL_NULL)" % (i, i)
|
|
452
|
+
else:
|
|
453
|
+
argVal = "argv[%d]" % i
|
|
454
|
+
argPtr = "&" + argVal
|
|
455
|
+
|
|
456
|
+
params = {
|
|
457
|
+
'name': name,
|
|
458
|
+
'argVal': argVal,
|
|
459
|
+
'argPtr': argPtr
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
typeName = getBuiltinOrNativeTypeName(type)
|
|
463
|
+
if typeName is not None:
|
|
464
|
+
template = argumentUnboxingTemplates.get(typeName)
|
|
465
|
+
if template is not None:
|
|
466
|
+
if optional and ("${argPtr}" in template):
|
|
467
|
+
warn("Optional parameters of type %s are not supported."
|
|
468
|
+
% type.name)
|
|
469
|
+
f.write(substitute(template, params))
|
|
470
|
+
return rvdeclared
|
|
471
|
+
# else fall through; the type isn't supported yet.
|
|
472
|
+
elif isInterfaceType(type):
|
|
473
|
+
if type.name == 'nsIVariant':
|
|
474
|
+
# Totally custom.
|
|
475
|
+
assert haveCcx
|
|
476
|
+
template = (
|
|
477
|
+
" nsCOMPtr<nsIVariant> ${name}(already_AddRefed<nsIVariant>("
|
|
478
|
+
"XPCVariant::newVariant(ccx, ${argVal})));\n"
|
|
479
|
+
" if (!${name})\n"
|
|
480
|
+
" return JS_FALSE;\n")
|
|
481
|
+
f.write(substitute(template, params))
|
|
482
|
+
return rvdeclared
|
|
483
|
+
elif type.name == 'nsIAtom':
|
|
484
|
+
# Should have special atomizing behavior. Fall through.
|
|
485
|
+
pass
|
|
486
|
+
else:
|
|
487
|
+
if not rvdeclared:
|
|
488
|
+
f.write(" nsresult rv;\n");
|
|
489
|
+
f.write(" nsCOMPtr<%s> %s;\n" % (type.name, name))
|
|
490
|
+
f.write(" rv = xpc_qsUnwrapArg<%s>("
|
|
491
|
+
"cx, %s, getter_AddRefs(%s));\n"
|
|
492
|
+
% (type.name, argVal, name))
|
|
493
|
+
f.write(" if (NS_FAILED(rv)) {\n")
|
|
494
|
+
if isSetter:
|
|
495
|
+
f.write(" xpc_qsThrowBadSetterValue("
|
|
496
|
+
"cx, rv, JSVAL_TO_OBJECT(*tvr.addr()), id);\n")
|
|
497
|
+
elif haveCcx:
|
|
498
|
+
f.write(" xpc_qsThrowBadArgWithCcx(ccx, rv, %d);\n" % i)
|
|
499
|
+
else:
|
|
500
|
+
f.write(" xpc_qsThrowBadArg(cx, rv, vp, %d);\n" % i)
|
|
501
|
+
f.write(" return JS_FALSE;\n"
|
|
502
|
+
" }\n")
|
|
503
|
+
return True
|
|
504
|
+
|
|
505
|
+
warn("Unable to unbox argument of type %s" % type.name)
|
|
506
|
+
if i is None:
|
|
507
|
+
src = '*vp'
|
|
508
|
+
else:
|
|
509
|
+
src = 'argv[%d]' % i
|
|
510
|
+
f.write(" !; // TODO - Unbox argument %s = %s\n" % (name, src))
|
|
511
|
+
return rvdeclared
|
|
512
|
+
|
|
513
|
+
def writeResultDecl(f, type, varname):
|
|
514
|
+
if isVoidType(type):
|
|
515
|
+
return # nothing to declare
|
|
516
|
+
|
|
517
|
+
t = unaliasType(type)
|
|
518
|
+
if t.kind == 'builtin':
|
|
519
|
+
if not t.nativename.endswith('*'):
|
|
520
|
+
if type.kind == 'typedef':
|
|
521
|
+
typeName = type.name # use it
|
|
522
|
+
else:
|
|
523
|
+
typeName = t.nativename
|
|
524
|
+
f.write(" %s %s;\n" % (typeName, varname))
|
|
525
|
+
return
|
|
526
|
+
elif t.kind == 'native':
|
|
527
|
+
name = getBuiltinOrNativeTypeName(t)
|
|
528
|
+
if name in ('[domstring]', '[astring]'):
|
|
529
|
+
f.write(" nsString %s;\n" % varname)
|
|
530
|
+
return
|
|
531
|
+
elif t.kind in ('interface', 'forward'):
|
|
532
|
+
f.write(" nsCOMPtr<%s> %s;\n" % (type.name, varname))
|
|
533
|
+
return
|
|
534
|
+
|
|
535
|
+
warn("Unable to declare result of type %s" % type.name)
|
|
536
|
+
f.write(" !; // TODO - Declare out parameter `%s`.\n" % varname)
|
|
537
|
+
|
|
538
|
+
def outParamForm(name, type):
|
|
539
|
+
type = unaliasType(type)
|
|
540
|
+
if type.kind == 'builtin':
|
|
541
|
+
return '&' + name
|
|
542
|
+
elif type.kind == 'native':
|
|
543
|
+
if type.modifier == 'ref':
|
|
544
|
+
return name
|
|
545
|
+
else:
|
|
546
|
+
return '&' + name
|
|
547
|
+
else:
|
|
548
|
+
return 'getter_AddRefs(%s)' % name
|
|
549
|
+
|
|
550
|
+
# From NativeData2JS.
|
|
551
|
+
resultConvTemplates = {
|
|
552
|
+
'void':
|
|
553
|
+
" ${jsvalRef} = JSVAL_VOID;\n"
|
|
554
|
+
" return JS_TRUE;\n",
|
|
555
|
+
|
|
556
|
+
'short':
|
|
557
|
+
" ${jsvalRef} = INT_TO_JSVAL((int32) result);\n"
|
|
558
|
+
" return JS_TRUE;\n",
|
|
559
|
+
|
|
560
|
+
'long':
|
|
561
|
+
" return xpc_qsInt32ToJsval(cx, result, ${jsvalPtr});\n",
|
|
562
|
+
|
|
563
|
+
'long long':
|
|
564
|
+
" return xpc_qsInt64ToJsval(cx, result, ${jsvalPtr};\n",
|
|
565
|
+
|
|
566
|
+
'unsigned short':
|
|
567
|
+
" ${jsvalRef} = INT_TO_JSVAL((int32) result);\n"
|
|
568
|
+
" return JS_TRUE;\n",
|
|
569
|
+
|
|
570
|
+
'unsigned long':
|
|
571
|
+
" return xpc_qsUint32ToJsval(cx, result, ${jsvalPtr});\n",
|
|
572
|
+
|
|
573
|
+
'unsigned long long':
|
|
574
|
+
" return xpc_qsUint64ToJsval(cx, result, ${jsvalPtr});\n",
|
|
575
|
+
|
|
576
|
+
'float':
|
|
577
|
+
" return JS_NewNumberValue(cx, result, ${jsvalPtr});\n",
|
|
578
|
+
|
|
579
|
+
'double':
|
|
580
|
+
" return JS_NewNumberValue(cx, result, ${jsvalPtr});\n",
|
|
581
|
+
|
|
582
|
+
'boolean':
|
|
583
|
+
" ${jsvalRef} = (result ? JSVAL_TRUE : JSVAL_FALSE);\n"
|
|
584
|
+
" return JS_TRUE;\n",
|
|
585
|
+
|
|
586
|
+
'[astring]':
|
|
587
|
+
" return xpc_qsStringToJsval(cx, result, ${jsvalPtr});\n",
|
|
588
|
+
|
|
589
|
+
'[domstring]':
|
|
590
|
+
" return xpc_qsStringToJsval(cx, result, ${jsvalPtr});\n"
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
def isVariantType(t):
|
|
594
|
+
return isSpecificInterfaceType(t, 'nsIVariant')
|
|
595
|
+
|
|
596
|
+
def writeResultConv(f, type, paramNum, jsvalPtr, jsvalRef):
|
|
597
|
+
""" Emit code to convert the C++ variable `result` to a jsval.
|
|
598
|
+
|
|
599
|
+
The emitted code contains a return statement; it returns JS_TRUE on
|
|
600
|
+
success, JS_FALSE on error.
|
|
601
|
+
"""
|
|
602
|
+
# From NativeData2JS.
|
|
603
|
+
typeName = getBuiltinOrNativeTypeName(type)
|
|
604
|
+
if typeName is not None:
|
|
605
|
+
template = resultConvTemplates.get(typeName)
|
|
606
|
+
if template is not None:
|
|
607
|
+
values = {'jsvalRef': jsvalRef,
|
|
608
|
+
'jsvalPtr': jsvalPtr}
|
|
609
|
+
f.write(substitute(template, values))
|
|
610
|
+
return
|
|
611
|
+
# else fall through; this type isn't supported yet
|
|
612
|
+
elif isInterfaceType(type):
|
|
613
|
+
if isVariantType(type):
|
|
614
|
+
f.write(" return xpc_qsVariantToJsval(ccx, result, %d, %s);\n"
|
|
615
|
+
% (paramNum, jsvalPtr))
|
|
616
|
+
return
|
|
617
|
+
else:
|
|
618
|
+
f.write(" AutoMarkingNativeInterfacePtr resultiface(ccx, "
|
|
619
|
+
"%s_Interface(ccx));\n" % type.name)
|
|
620
|
+
f.write(" return xpc_qsXPCOMObjectToJsval(ccx, result, "
|
|
621
|
+
"xpc_qsGetWrapperCache(result), resultiface, %s);\n"
|
|
622
|
+
% jsvalPtr)
|
|
623
|
+
return
|
|
624
|
+
|
|
625
|
+
warn("Unable to convert result of type %s" % type.name)
|
|
626
|
+
f.write(" !; // TODO - Convert `result` to jsval, store in `%s`.\n"
|
|
627
|
+
% jsvalRef)
|
|
628
|
+
f.write(" return xpc_qsThrow(cx, NS_ERROR_UNEXPECTED); // FIXME\n")
|
|
629
|
+
|
|
630
|
+
def anyParamRequiresCcx(member):
|
|
631
|
+
for p in member.params:
|
|
632
|
+
if isVariantType(p.realtype):
|
|
633
|
+
return True
|
|
634
|
+
return False
|
|
635
|
+
|
|
636
|
+
def validateParam(member, param):
|
|
637
|
+
def pfail(msg):
|
|
638
|
+
raise UserError(
|
|
639
|
+
member.iface.name + '.' + member.name + ": "
|
|
640
|
+
"parameter " + param.name + ": " + msg)
|
|
641
|
+
|
|
642
|
+
if param.iid_is is not None:
|
|
643
|
+
pfail("iid_is parameters are not supported.")
|
|
644
|
+
if param.size_is is not None:
|
|
645
|
+
pfail("size_is parameters are not supported.")
|
|
646
|
+
if param.retval:
|
|
647
|
+
pfail("Unexpected retval parameter!")
|
|
648
|
+
if param.paramtype in ('out', 'inout'):
|
|
649
|
+
pfail("Out parameters are not supported.")
|
|
650
|
+
if param.const or param.array or param.shared:
|
|
651
|
+
pfail("I am a simple caveman.")
|
|
652
|
+
|
|
653
|
+
def writeQuickStub(f, customMethodCalls, member, stubName, isSetter=False):
|
|
654
|
+
""" Write a single quick stub (a custom SpiderMonkey getter/setter/method)
|
|
655
|
+
for the specified XPCOM interface-member.
|
|
656
|
+
"""
|
|
657
|
+
isAttr = (member.kind == 'attribute')
|
|
658
|
+
isMethod = (member.kind == 'method')
|
|
659
|
+
assert isAttr or isMethod
|
|
660
|
+
isGetter = isAttr and not isSetter
|
|
661
|
+
|
|
662
|
+
customMethodCall = customMethodCalls.get(stubName, None)
|
|
663
|
+
|
|
664
|
+
# Function prolog.
|
|
665
|
+
f.write("static JSBool\n")
|
|
666
|
+
if isAttr:
|
|
667
|
+
# JSPropertyOp signature.
|
|
668
|
+
f.write(stubName + "(JSContext *cx, JSObject *obj, jsval id, "
|
|
669
|
+
"jsval *vp)\n")
|
|
670
|
+
else:
|
|
671
|
+
# JSFastNative.
|
|
672
|
+
f.write(stubName + "(JSContext *cx, uintN argc, jsval *vp)\n")
|
|
673
|
+
f.write("{\n")
|
|
674
|
+
f.write(" XPC_QS_ASSERT_CONTEXT_OK(cx);\n")
|
|
675
|
+
|
|
676
|
+
# For methods, compute "this".
|
|
677
|
+
if isMethod:
|
|
678
|
+
f.write(" JSObject *obj = JS_THIS_OBJECT(cx, vp);\n"
|
|
679
|
+
" if (!obj)\n"
|
|
680
|
+
" return JS_FALSE;\n")
|
|
681
|
+
|
|
682
|
+
# Create ccx if needed.
|
|
683
|
+
haveCcx = isMethod and (isInterfaceType(member.realtype)
|
|
684
|
+
or anyParamRequiresCcx(member))
|
|
685
|
+
if haveCcx:
|
|
686
|
+
f.write(" XPCCallContext ccx(JS_CALLER, cx, obj, "
|
|
687
|
+
"JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)));\n")
|
|
688
|
+
else:
|
|
689
|
+
# In some cases we emit a ccx, but it does not count as
|
|
690
|
+
# "haveCcx" because it's not complete.
|
|
691
|
+
if isAttr and isInterfaceType(member.realtype):
|
|
692
|
+
f.write(" XPCCallContext ccx(JS_CALLER, cx, obj);\n")
|
|
693
|
+
|
|
694
|
+
# Get the 'self' pointer.
|
|
695
|
+
if customMethodCall is None or not 'thisType' in customMethodCall:
|
|
696
|
+
f.write(" %s *self;\n" % member.iface.name)
|
|
697
|
+
else:
|
|
698
|
+
f.write(" %s *self;\n" % customMethodCall['thisType'])
|
|
699
|
+
f.write(" xpc_qsSelfRef selfref;\n")
|
|
700
|
+
# Don't use FromCcx for getters or setters; the way we construct the ccx in
|
|
701
|
+
# a getter/setter causes it to find the wrong wrapper in some cases.
|
|
702
|
+
if isMethod and haveCcx:
|
|
703
|
+
# Undocumented, but the interpreter puts 'this' at argv[-1],
|
|
704
|
+
# which is vp[1]; and it's ok to overwrite it.
|
|
705
|
+
f.write(" if (!xpc_qsUnwrapThisFromCcx(ccx, &self, &selfref.ptr, "
|
|
706
|
+
"&vp[1]))\n")
|
|
707
|
+
f.write(" return JS_FALSE;\n")
|
|
708
|
+
else:
|
|
709
|
+
if isGetter:
|
|
710
|
+
pthisval = 'vp'
|
|
711
|
+
elif isSetter:
|
|
712
|
+
f.write(" xpc_qsTempRoot tvr(cx);\n")
|
|
713
|
+
pthisval = 'tvr.addr()'
|
|
714
|
+
else:
|
|
715
|
+
pthisval = '&vp[1]' # as above, ok to overwrite vp[1]
|
|
716
|
+
|
|
717
|
+
f.write(" if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, "
|
|
718
|
+
"%s))\n" % pthisval)
|
|
719
|
+
f.write(" return JS_FALSE;\n")
|
|
720
|
+
|
|
721
|
+
if isMethod:
|
|
722
|
+
# If there are any required arguments, check argc.
|
|
723
|
+
requiredArgs = len(member.params)
|
|
724
|
+
while requiredArgs and member.params[requiredArgs-1].optional:
|
|
725
|
+
requiredArgs -= 1
|
|
726
|
+
if requiredArgs:
|
|
727
|
+
f.write(" if (argc < %d)\n" % requiredArgs)
|
|
728
|
+
f.write(" return xpc_qsThrow(cx, "
|
|
729
|
+
"NS_ERROR_XPC_NOT_ENOUGH_ARGS);\n")
|
|
730
|
+
|
|
731
|
+
# Convert in-parameters.
|
|
732
|
+
rvdeclared = False
|
|
733
|
+
if isMethod:
|
|
734
|
+
if len(member.params) > 0:
|
|
735
|
+
f.write(" jsval *argv = JS_ARGV(cx, vp);\n")
|
|
736
|
+
for i, param in enumerate(member.params):
|
|
737
|
+
validateParam(member, param)
|
|
738
|
+
# Emit code to convert this argument from jsval.
|
|
739
|
+
rvdeclared = writeArgumentUnboxing(
|
|
740
|
+
f, i, 'arg%d' % i, param.realtype,
|
|
741
|
+
haveCcx=haveCcx,
|
|
742
|
+
optional=param.optional,
|
|
743
|
+
rvdeclared=rvdeclared)
|
|
744
|
+
elif isSetter:
|
|
745
|
+
rvdeclared = writeArgumentUnboxing(f, None, 'arg0', member.realtype,
|
|
746
|
+
haveCcx=False, optional=False,
|
|
747
|
+
rvdeclared=rvdeclared)
|
|
748
|
+
|
|
749
|
+
if customMethodCall is not None:
|
|
750
|
+
f.write("%s\n" % customMethodCall['code'])
|
|
751
|
+
f.write("#ifdef DEBUG\n")
|
|
752
|
+
f.write(" nsresult debug_rv;\n")
|
|
753
|
+
f.write(" nsCOMPtr<%s> debug_self = do_QueryInterface(self);\n"
|
|
754
|
+
% member.iface.name);
|
|
755
|
+
prefix = 'debug_'
|
|
756
|
+
else:
|
|
757
|
+
if not rvdeclared:
|
|
758
|
+
f.write(" nsresult rv;\n")
|
|
759
|
+
rvdeclared = True
|
|
760
|
+
prefix = ''
|
|
761
|
+
|
|
762
|
+
resultname = prefix + 'result'
|
|
763
|
+
selfname = prefix + 'self'
|
|
764
|
+
nsresultname = prefix + 'rv'
|
|
765
|
+
|
|
766
|
+
# Prepare out-parameter.
|
|
767
|
+
if isMethod or isGetter:
|
|
768
|
+
writeResultDecl(f, member.realtype, resultname)
|
|
769
|
+
|
|
770
|
+
# Call the method.
|
|
771
|
+
if isMethod:
|
|
772
|
+
comName = header.methodNativeName(member)
|
|
773
|
+
argv = ['arg' + str(i) for i, p in enumerate(member.params)]
|
|
774
|
+
if not isVoidType(member.realtype):
|
|
775
|
+
argv.append(outParamForm(resultname, member.realtype))
|
|
776
|
+
args = ', '.join(argv)
|
|
777
|
+
else:
|
|
778
|
+
comName = header.attributeNativeName(member, isGetter)
|
|
779
|
+
if isGetter:
|
|
780
|
+
args = outParamForm(resultname, member.realtype)
|
|
781
|
+
else:
|
|
782
|
+
args = "arg0"
|
|
783
|
+
|
|
784
|
+
f.write(" %s = %s->%s(%s);\n" % (nsresultname, selfname, comName, args))
|
|
785
|
+
|
|
786
|
+
if customMethodCall is None:
|
|
787
|
+
# Check for errors.
|
|
788
|
+
f.write(" if (NS_FAILED(rv))\n")
|
|
789
|
+
if isMethod:
|
|
790
|
+
if haveCcx:
|
|
791
|
+
f.write(" return xpc_qsThrowMethodFailedWithCcx("
|
|
792
|
+
"ccx, rv);\n")
|
|
793
|
+
else:
|
|
794
|
+
f.write(" return xpc_qsThrowMethodFailed("
|
|
795
|
+
"cx, rv, vp);\n")
|
|
796
|
+
else:
|
|
797
|
+
if isGetter:
|
|
798
|
+
thisval = '*vp'
|
|
799
|
+
else:
|
|
800
|
+
thisval = '*tvr.addr()'
|
|
801
|
+
f.write(" return xpc_qsThrowGetterSetterFailed(cx, rv, " +
|
|
802
|
+
"JSVAL_TO_OBJECT(%s), id);\n" % thisval)
|
|
803
|
+
else:
|
|
804
|
+
if isMethod or isGetter:
|
|
805
|
+
f.write(" NS_ASSERTION(NS_SUCCEEDED(debug_rv) && "
|
|
806
|
+
"xpc_qsSameResult(debug_result, result),\n"
|
|
807
|
+
" \"Got the wrong answer from the custom "
|
|
808
|
+
"method call!\");\n")
|
|
809
|
+
f.write("#endif\n")
|
|
810
|
+
|
|
811
|
+
# Convert the return value.
|
|
812
|
+
if isMethod:
|
|
813
|
+
writeResultConv(f, member.realtype, len(member.params) + 1, 'vp', '*vp')
|
|
814
|
+
elif isGetter:
|
|
815
|
+
writeResultConv(f, member.realtype, None, 'vp', '*vp')
|
|
816
|
+
else:
|
|
817
|
+
f.write(" return JS_TRUE;\n")
|
|
818
|
+
|
|
819
|
+
# Epilog.
|
|
820
|
+
f.write("}\n\n")
|
|
821
|
+
|
|
822
|
+
traceTypeMap = {
|
|
823
|
+
'void':
|
|
824
|
+
["jsval ", "JSVAL", "JSVAL_VOID"],
|
|
825
|
+
'boolean':
|
|
826
|
+
["JSBool ", "BOOL", "JS_FALSE"],
|
|
827
|
+
'short':
|
|
828
|
+
["int32 ", "INT32", "0"],
|
|
829
|
+
'unsigned short':
|
|
830
|
+
["uint32 ", "UINT32", "0"],
|
|
831
|
+
'long':
|
|
832
|
+
["int32 ", "INT32", "0"],
|
|
833
|
+
'unsigned long':
|
|
834
|
+
["uint32 ", "UINT32", "0"],
|
|
835
|
+
'float':
|
|
836
|
+
["jsdouble ", "DOUBLE", "0"],
|
|
837
|
+
'double':
|
|
838
|
+
["jsdouble ", "DOUBLE", "0"],
|
|
839
|
+
|
|
840
|
+
# XXX STRING_FAIL can't return a null'd string, ask jorendorff, maybe a JSVAL_FAIL
|
|
841
|
+
'[astring]':
|
|
842
|
+
["JSString *", "STRING", "nsnull"],
|
|
843
|
+
'[domstring]':
|
|
844
|
+
["JSString *", "STRING", "nsnull"],
|
|
845
|
+
'[cstring]':
|
|
846
|
+
["JSString *", "STRING", "nsnull"],
|
|
847
|
+
'string':
|
|
848
|
+
["JSString *", "STRING", "nsnull"],
|
|
849
|
+
'wstring':
|
|
850
|
+
["JSString *", "STRING", "nsnull"],
|
|
851
|
+
|
|
852
|
+
'_default':
|
|
853
|
+
["jsval ", "JSVAL", "JSVAL_VOID"]
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
def getTraceType(type):
|
|
857
|
+
traceType = traceTypeMap.get(type) or traceTypeMap.get("_default")
|
|
858
|
+
assert traceType
|
|
859
|
+
return traceType[0]
|
|
860
|
+
|
|
861
|
+
def getTraceInfoType(type):
|
|
862
|
+
traceType = traceTypeMap.get(type) or traceTypeMap.get("_default")
|
|
863
|
+
assert traceType
|
|
864
|
+
return traceType[1]
|
|
865
|
+
|
|
866
|
+
def getTraceInfoDefaultReturn(type):
|
|
867
|
+
traceType = traceTypeMap.get(type) or traceTypeMap.get("_default")
|
|
868
|
+
assert traceType
|
|
869
|
+
return traceType[2]
|
|
870
|
+
|
|
871
|
+
def getFailureString(retval, indent):
|
|
872
|
+
assert indent > 0
|
|
873
|
+
ret = " " * (4 * indent)
|
|
874
|
+
ret += "js_SetTraceableNativeFailed(cx);\n"
|
|
875
|
+
ret += " " * (4 * indent)
|
|
876
|
+
ret += "return %s;\n" % retval
|
|
877
|
+
ret += " " * (4 * (indent - 1))
|
|
878
|
+
ret += "}\n"
|
|
879
|
+
return ret
|
|
880
|
+
|
|
881
|
+
def writeFailure(f, retval, indent):
|
|
882
|
+
f.write(getFailureString(retval, indent))
|
|
883
|
+
|
|
884
|
+
traceableArgumentConversionTemplates = {
|
|
885
|
+
'short':
|
|
886
|
+
" PRint16 ${name} = (PRint16) ${argVal};\n",
|
|
887
|
+
'unsigned short':
|
|
888
|
+
" PRUint16 ${name} = (PRUint16) ${argVal};\n",
|
|
889
|
+
'long':
|
|
890
|
+
" PRInt32 ${name} = (PRInt32) ${argVal};\n",
|
|
891
|
+
'unsigned long':
|
|
892
|
+
" PRUint32 ${name} = (PRUint32) ${argVal};\n",
|
|
893
|
+
'boolean':
|
|
894
|
+
" PRBool ${name} = (PRBool) ${argVal};\n",
|
|
895
|
+
'float':
|
|
896
|
+
" float ${name} = (float) ${argVal};\n",
|
|
897
|
+
'double':
|
|
898
|
+
" jsdouble ${name} = ${argVal};\n",
|
|
899
|
+
'[astring]':
|
|
900
|
+
" XPCReadableJSStringWrapper ${name}(${argVal});\n",
|
|
901
|
+
'[domstring]':
|
|
902
|
+
" XPCReadableJSStringWrapper ${name}(${argVal});\n",
|
|
903
|
+
'[cstring]':
|
|
904
|
+
" NS_ConvertUTF16toUTF8 ${name}("
|
|
905
|
+
"(const PRUnichar *)JS_GetStringChars(${argVal}), "
|
|
906
|
+
"JS_GetStringLength(${argVal}));\n",
|
|
907
|
+
'string':
|
|
908
|
+
" NS_ConvertUTF16toUTF8 ${name}_utf8("
|
|
909
|
+
"(const PRUnichar *)JS_GetStringChars(${argVal}), "
|
|
910
|
+
"JS_GetStringLength(${argVal}));\n"
|
|
911
|
+
" const char *${name} = ${name}_utf8.get();\n",
|
|
912
|
+
'wstring':
|
|
913
|
+
" const PRUnichar *${name} = JS_GetStringChars({argVal});\n",
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
def writeTraceableArgumentConversion(f, member, i, name, type, haveCcx,
|
|
917
|
+
rvdeclared):
|
|
918
|
+
argVal = "arg%d" % i
|
|
919
|
+
argPtr = "&" + argVal
|
|
920
|
+
|
|
921
|
+
params = {
|
|
922
|
+
'name': name,
|
|
923
|
+
'argVal': argVal
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
typeName = getBuiltinOrNativeTypeName(type)
|
|
927
|
+
if typeName is not None:
|
|
928
|
+
template = traceableArgumentConversionTemplates.get(typeName)
|
|
929
|
+
if template is not None:
|
|
930
|
+
f.write(substitute(template, params))
|
|
931
|
+
return rvdeclared
|
|
932
|
+
# else fall through; the type isn't supported yet.
|
|
933
|
+
elif isInterfaceType(type):
|
|
934
|
+
if type.name == 'nsIVariant':
|
|
935
|
+
# Totally custom.
|
|
936
|
+
assert haveCcx
|
|
937
|
+
template = (
|
|
938
|
+
" nsCOMPtr<nsIVariant> ${name}(already_AddRefed<nsIVariant>("
|
|
939
|
+
"XPCVariant::newVariant(ccx, ${argVal})));\n"
|
|
940
|
+
" if (!${name}) {\n")
|
|
941
|
+
f.write(substitute(template, params))
|
|
942
|
+
writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
|
|
943
|
+
return rvdeclared
|
|
944
|
+
elif type.name == 'nsIAtom':
|
|
945
|
+
# Should have special atomizing behavior. Fall through.
|
|
946
|
+
pass
|
|
947
|
+
else:
|
|
948
|
+
if not rvdeclared:
|
|
949
|
+
f.write(" nsresult rv;\n");
|
|
950
|
+
f.write(" nsCOMPtr<%s> %s;\n" % (type.name, name))
|
|
951
|
+
f.write(" rv = xpc_qsUnwrapArg<%s>("
|
|
952
|
+
"cx, %s, getter_AddRefs(%s));\n"
|
|
953
|
+
% (type.name, argVal, name))
|
|
954
|
+
f.write(" if (NS_FAILED(rv)) {\n")
|
|
955
|
+
if haveCcx:
|
|
956
|
+
f.write(" xpc_qsThrowBadArgWithCcx(ccx, rv, %d);\n" % i)
|
|
957
|
+
else:
|
|
958
|
+
# XXX Fix this to return a real error!
|
|
959
|
+
f.write(" xpc_qsThrowBadArgWithDetails(cx, rv, %d, "
|
|
960
|
+
"\"%s\", \"%s\");\n"
|
|
961
|
+
% (i, member.iface.name, member.name))
|
|
962
|
+
writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
|
|
963
|
+
return True
|
|
964
|
+
|
|
965
|
+
print member
|
|
966
|
+
warn("Unable to unbox argument of type %s" % type.name)
|
|
967
|
+
f.write(" !; // TODO - Unbox argument %s = arg%d\n" % (name, i))
|
|
968
|
+
return rvdeclared
|
|
969
|
+
|
|
970
|
+
traceableResultConvTemplates = {
|
|
971
|
+
'void':
|
|
972
|
+
" return JSVAL_VOID;\n",
|
|
973
|
+
'short':
|
|
974
|
+
" return int32(result);\n",
|
|
975
|
+
'unsigned short':
|
|
976
|
+
" return uint32(result);\n",
|
|
977
|
+
'long':
|
|
978
|
+
" return int32(result);\n",
|
|
979
|
+
'unsigned long':
|
|
980
|
+
" return uint32(result);\n",
|
|
981
|
+
'boolean':
|
|
982
|
+
" return result ? JS_TRUE : JS_FALSE;\n",
|
|
983
|
+
'[domstring]':
|
|
984
|
+
" jsval rval;\n"
|
|
985
|
+
" if (!xpc_qsStringToJsval(cx, result, &rval)) {\n"
|
|
986
|
+
" JS_ReportOutOfMemory(cx);\n${errorStr}"
|
|
987
|
+
" return rval;\n",
|
|
988
|
+
'[astring]':
|
|
989
|
+
" jsval rval;\n"
|
|
990
|
+
" if (!xpc_qsStringToJsval(cx, result, &rval)) {\n"
|
|
991
|
+
" JS_ReportOutOfMemory(cx);\n${errorStr}"
|
|
992
|
+
" return rval;\n",
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
def writeTraceableResultConv(f, type, paramNum):
|
|
996
|
+
typeName = getBuiltinOrNativeTypeName(type)
|
|
997
|
+
if typeName is not None:
|
|
998
|
+
template = traceableResultConvTemplates.get(typeName)
|
|
999
|
+
if template is not None:
|
|
1000
|
+
values = { 'errorStr': getFailureString(
|
|
1001
|
+
getTraceInfoDefaultReturn(type), 2) }
|
|
1002
|
+
f.write(substitute(template, values))
|
|
1003
|
+
return
|
|
1004
|
+
# else fall through; this type isn't supported yet
|
|
1005
|
+
elif isInterfaceType(type):
|
|
1006
|
+
if isVariantType(type):
|
|
1007
|
+
f.write(" JSBool ok = xpc_qsVariantToJsval(ccx, result, %d, "
|
|
1008
|
+
"tvr.addr());\n" % paramNum)
|
|
1009
|
+
else:
|
|
1010
|
+
f.write(" AutoMarkingNativeInterfacePtr resultiface(ccx, "
|
|
1011
|
+
"%s_Interface(ccx));\n" % type.name)
|
|
1012
|
+
f.write(" JSBool ok = xpc_qsXPCOMObjectToJsval(ccx, result, "
|
|
1013
|
+
"xpc_qsGetWrapperCache(result), resultiface, tvr.addr());"
|
|
1014
|
+
"\n")
|
|
1015
|
+
f.write(" if (!ok) {\n");
|
|
1016
|
+
writeFailure(f, getTraceInfoDefaultReturn(type), 2)
|
|
1017
|
+
f.write(" return *tvr.addr();\n")
|
|
1018
|
+
return
|
|
1019
|
+
|
|
1020
|
+
warn("Unable to convert result of type %s" % typeName)
|
|
1021
|
+
f.write(" !; // TODO - Convert `result` to jsval, store in rval.\n")
|
|
1022
|
+
f.write(" return xpc_qsThrow(cx, NS_ERROR_UNEXPECTED); // FIXME\n")
|
|
1023
|
+
|
|
1024
|
+
def writeTraceableQuickStub(f, customMethodCalls, member, stubName):
|
|
1025
|
+
assert member.traceable
|
|
1026
|
+
|
|
1027
|
+
traceInfo = {
|
|
1028
|
+
'type': getTraceInfoType(member.type) + "_FAIL",
|
|
1029
|
+
'params': ["CONTEXT", "THIS"]
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
haveCcx = isInterfaceType(member.realtype) or anyParamRequiresCcx(member)
|
|
1033
|
+
|
|
1034
|
+
customMethodCall = customMethodCalls.get(stubName, None)
|
|
1035
|
+
|
|
1036
|
+
# Write the function
|
|
1037
|
+
f.write("static %sFASTCALL\n" % getTraceType(member.type))
|
|
1038
|
+
f.write("%s(JSContext *cx, JSObject *obj" % (stubName + "_tn"))
|
|
1039
|
+
if haveCcx:
|
|
1040
|
+
f.write(", JSObject *callee")
|
|
1041
|
+
traceInfo["params"].append("CALLEE")
|
|
1042
|
+
for i, param in enumerate(member.params):
|
|
1043
|
+
type = getBuiltinOrNativeTypeName(param.realtype)
|
|
1044
|
+
f.write(", %sarg%d" % (getTraceType(type), i))
|
|
1045
|
+
traceInfo["params"].append(getTraceInfoType(type))
|
|
1046
|
+
f.write(")\n{\n");
|
|
1047
|
+
f.write(" XPC_QS_ASSERT_CONTEXT_OK(cx);\n")
|
|
1048
|
+
|
|
1049
|
+
# Create ccx if needed.
|
|
1050
|
+
if haveCcx:
|
|
1051
|
+
f.write(" XPCCallContext ccx(JS_CALLER, cx, obj, callee);\n")
|
|
1052
|
+
|
|
1053
|
+
# Get the 'self' pointer.
|
|
1054
|
+
if customMethodCall is None or not 'thisType' in customMethodCall:
|
|
1055
|
+
f.write(" %s *self;\n" % member.iface.name)
|
|
1056
|
+
else:
|
|
1057
|
+
f.write(" %s *self;\n" % customMethodCall['thisType'])
|
|
1058
|
+
f.write(" xpc_qsSelfRef selfref;\n")
|
|
1059
|
+
f.write(" xpc_qsTempRoot tvr(cx);\n")
|
|
1060
|
+
if haveCcx:
|
|
1061
|
+
f.write(" if (!xpc_qsUnwrapThisFromCcx(ccx, &self, &selfref.ptr, "
|
|
1062
|
+
"tvr.addr())) {\n")
|
|
1063
|
+
else:
|
|
1064
|
+
f.write(" if (!xpc_qsUnwrapThis(cx, obj, &self, &selfref.ptr, "
|
|
1065
|
+
"tvr.addr())) {\n")
|
|
1066
|
+
writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
|
|
1067
|
+
|
|
1068
|
+
argNames = []
|
|
1069
|
+
|
|
1070
|
+
# Convert in-parameters.
|
|
1071
|
+
rvdeclared = False
|
|
1072
|
+
for i, param in enumerate(member.params):
|
|
1073
|
+
validateParam(member, param)
|
|
1074
|
+
type = unaliasType(param.realtype)
|
|
1075
|
+
argName = "_arg%d" % i
|
|
1076
|
+
rvdeclared = writeTraceableArgumentConversion(f, member, i, argName,
|
|
1077
|
+
param.realtype,
|
|
1078
|
+
haveCcx, rvdeclared)
|
|
1079
|
+
argNames.append(argName)
|
|
1080
|
+
|
|
1081
|
+
if customMethodCall is not None:
|
|
1082
|
+
f.write("%s\n" % customMethodCall['code'])
|
|
1083
|
+
f.write("#ifdef DEBUG\n")
|
|
1084
|
+
f.write(" nsresult debug_rv;\n")
|
|
1085
|
+
f.write(" nsCOMPtr<%s> debug_self = do_QueryInterface(self);\n"
|
|
1086
|
+
% member.iface.name);
|
|
1087
|
+
prefix = 'debug_'
|
|
1088
|
+
else:
|
|
1089
|
+
if not rvdeclared:
|
|
1090
|
+
f.write(" nsresult rv;\n")
|
|
1091
|
+
rvdeclared = True
|
|
1092
|
+
prefix = ''
|
|
1093
|
+
|
|
1094
|
+
resultname = prefix + 'result'
|
|
1095
|
+
selfname = prefix + 'self'
|
|
1096
|
+
nsresultname = prefix + 'rv'
|
|
1097
|
+
|
|
1098
|
+
# Prepare out-parameter.
|
|
1099
|
+
writeResultDecl(f, member.realtype, resultname)
|
|
1100
|
+
|
|
1101
|
+
# Call the method.
|
|
1102
|
+
comName = header.methodNativeName(member)
|
|
1103
|
+
if not isVoidType(member.realtype):
|
|
1104
|
+
argNames.append(outParamForm(resultname, member.realtype))
|
|
1105
|
+
args = ', '.join(argNames)
|
|
1106
|
+
|
|
1107
|
+
f.write(" %s = %s->%s(%s);\n" % (nsresultname, selfname, comName, args))
|
|
1108
|
+
|
|
1109
|
+
if customMethodCall is None:
|
|
1110
|
+
# Check for errors.
|
|
1111
|
+
f.write(" if (NS_FAILED(rv)) {\n")
|
|
1112
|
+
if haveCcx:
|
|
1113
|
+
f.write(" xpc_qsThrowMethodFailedWithCcx(ccx, rv);\n")
|
|
1114
|
+
else:
|
|
1115
|
+
# XXX Replace with a real error message!
|
|
1116
|
+
f.write(" xpc_qsThrowMethodFailedWithDetails(cx, rv, "
|
|
1117
|
+
"\"%s\", \"%s\");\n" % (member.iface.name, member.name))
|
|
1118
|
+
writeFailure(f, getTraceInfoDefaultReturn(member.type), 2)
|
|
1119
|
+
else:
|
|
1120
|
+
f.write(" NS_ASSERTION(NS_SUCCEEDED(debug_rv) && "
|
|
1121
|
+
"xpc_qsSameResult(debug_result, result),\n"
|
|
1122
|
+
" \"Got the wrong answer from the custom "
|
|
1123
|
+
"method call!\");\n")
|
|
1124
|
+
f.write("#endif\n")
|
|
1125
|
+
|
|
1126
|
+
# Convert the return value.
|
|
1127
|
+
writeTraceableResultConv(f, member.realtype, len(member.params) + 1)
|
|
1128
|
+
|
|
1129
|
+
# Epilog.
|
|
1130
|
+
f.write("}\n\n")
|
|
1131
|
+
|
|
1132
|
+
# Write the JS_DEFINE_TRCINFO block
|
|
1133
|
+
f.write("JS_DEFINE_TRCINFO_1(%s,\n" % stubName)
|
|
1134
|
+
f.write(" (%d, (static, %s, %s, %s, 0, 0)))\n\n"
|
|
1135
|
+
% (len(traceInfo["params"]), traceInfo["type"], stubName + "_tn",
|
|
1136
|
+
", ".join(traceInfo["params"])))
|
|
1137
|
+
|
|
1138
|
+
def writeAttrStubs(f, customMethodCalls, attr):
|
|
1139
|
+
getterName = (attr.iface.name + '_'
|
|
1140
|
+
+ header.attributeNativeName(attr, True))
|
|
1141
|
+
writeQuickStub(f, customMethodCalls, attr, getterName)
|
|
1142
|
+
if attr.readonly:
|
|
1143
|
+
setterName = 'xpc_qsReadOnlySetter'
|
|
1144
|
+
else:
|
|
1145
|
+
setterName = (attr.iface.name + '_'
|
|
1146
|
+
+ header.attributeNativeName(attr, False))
|
|
1147
|
+
writeQuickStub(f, customMethodCalls, attr, setterName, isSetter=True)
|
|
1148
|
+
|
|
1149
|
+
ps = ('{"%s", %s, %s}'
|
|
1150
|
+
% (attr.name, getterName, setterName))
|
|
1151
|
+
return ps
|
|
1152
|
+
|
|
1153
|
+
def writeMethodStub(f, customMethodCalls, method):
|
|
1154
|
+
""" Write a method stub to `f`. Return an xpc_qsFunctionSpec initializer. """
|
|
1155
|
+
stubName = method.iface.name + '_' + header.methodNativeName(method)
|
|
1156
|
+
writeQuickStub(f, customMethodCalls, method, stubName)
|
|
1157
|
+
fs = '{"%s", %s, %d}' % (method.name, stubName, len(method.params))
|
|
1158
|
+
return fs
|
|
1159
|
+
|
|
1160
|
+
def writeTraceableStub(f, customMethodCalls, method):
|
|
1161
|
+
""" Write a method stub to `f`. Return an xpc_qsTraceableSpec initializer. """
|
|
1162
|
+
stubName = method.iface.name + '_' + header.methodNativeName(method)
|
|
1163
|
+
writeTraceableQuickStub(f, customMethodCalls, method, stubName)
|
|
1164
|
+
fs = '{"%s", %s, %d}' % (method.name,
|
|
1165
|
+
"JS_DATA_TO_FUNC_PTR(JSNative, %s_trcinfo)" % stubName,
|
|
1166
|
+
len(method.params))
|
|
1167
|
+
return fs
|
|
1168
|
+
|
|
1169
|
+
def writeStubsForInterface(f, customMethodCalls, iface):
|
|
1170
|
+
f.write("// === interface %s\n\n" % iface.name)
|
|
1171
|
+
propspecs = []
|
|
1172
|
+
funcspecs = []
|
|
1173
|
+
tracespecs = []
|
|
1174
|
+
for member in iface.stubMembers:
|
|
1175
|
+
if member.kind == 'attribute':
|
|
1176
|
+
ps = writeAttrStubs(f, customMethodCalls, member)
|
|
1177
|
+
propspecs.append(ps)
|
|
1178
|
+
elif member.kind == 'method':
|
|
1179
|
+
fs = writeMethodStub(f, customMethodCalls, member)
|
|
1180
|
+
if member.traceable:
|
|
1181
|
+
ts = writeTraceableStub(f, customMethodCalls, member)
|
|
1182
|
+
tracespecs.append(ts)
|
|
1183
|
+
else:
|
|
1184
|
+
funcspecs.append(fs)
|
|
1185
|
+
else:
|
|
1186
|
+
raise TypeError('expected attribute or method, not %r'
|
|
1187
|
+
% member.__class__.__name__)
|
|
1188
|
+
|
|
1189
|
+
if propspecs:
|
|
1190
|
+
f.write("static const xpc_qsPropertySpec %s_properties[] = {\n"
|
|
1191
|
+
% iface.name)
|
|
1192
|
+
for ps in propspecs:
|
|
1193
|
+
f.write(" %s,\n" % ps)
|
|
1194
|
+
f.write(" {nsnull}};\n")
|
|
1195
|
+
if funcspecs:
|
|
1196
|
+
f.write("static const xpc_qsFunctionSpec %s_functions[] = {\n" % iface.name)
|
|
1197
|
+
for fs in funcspecs:
|
|
1198
|
+
f.write(" %s,\n" % fs)
|
|
1199
|
+
f.write(" {nsnull}};\n")
|
|
1200
|
+
if tracespecs:
|
|
1201
|
+
f.write("static const xpc_qsTraceableSpec %s_traceables[] = {\n" % iface.name)
|
|
1202
|
+
for ts in tracespecs:
|
|
1203
|
+
f.write(" %s,\n" % ts)
|
|
1204
|
+
f.write(" {nsnull}};\n")
|
|
1205
|
+
f.write('\n\n')
|
|
1206
|
+
|
|
1207
|
+
def hashIID(iid):
|
|
1208
|
+
# See nsIDKey::HashCode in nsHashtable.h.
|
|
1209
|
+
return int(iid[:8], 16)
|
|
1210
|
+
|
|
1211
|
+
uuid_re = re.compile(r'^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$')
|
|
1212
|
+
|
|
1213
|
+
def writeResultXPCInterfacesArray(f, conf, resulttypes):
|
|
1214
|
+
f.write("// === XPCNativeInterface cache \n\n")
|
|
1215
|
+
count = len(resulttypes)
|
|
1216
|
+
if count > 0:
|
|
1217
|
+
f.write("static XPCNativeInterface* interfaces[%d];\n\n" % count)
|
|
1218
|
+
f.write("void %s_MarkInterfaces()\n"
|
|
1219
|
+
"{\n" % conf.name)
|
|
1220
|
+
if count > 0:
|
|
1221
|
+
f.write(" for (PRUint32 i = 0; i < %d; ++i)\n"
|
|
1222
|
+
" if (interfaces[i])\n"
|
|
1223
|
+
" interfaces[i]->Mark();\n" % count)
|
|
1224
|
+
f.write("}\n")
|
|
1225
|
+
f.write("void %s_ClearInterfaces()\n"
|
|
1226
|
+
"{\n" % conf.name)
|
|
1227
|
+
if count > 0:
|
|
1228
|
+
f.write(" memset(interfaces, 0, %d * "
|
|
1229
|
+
"sizeof(XPCNativeInterface*));\n" % count)
|
|
1230
|
+
f.write("}\n\n")
|
|
1231
|
+
i = 0
|
|
1232
|
+
for type in resulttypes:
|
|
1233
|
+
f.write("XPC_QS_DEFINE_XPCNATIVEINTERFACE_GETTER(%s, interfaces[%d])\n"
|
|
1234
|
+
% (type, i))
|
|
1235
|
+
i += 1
|
|
1236
|
+
if count > 0:
|
|
1237
|
+
f.write("\n\n")
|
|
1238
|
+
|
|
1239
|
+
def writeDefiner(f, conf, interfaces):
|
|
1240
|
+
f.write("// === Definer\n\n")
|
|
1241
|
+
|
|
1242
|
+
# generate the static hash table
|
|
1243
|
+
loadFactor = 0.6
|
|
1244
|
+
size = int(len(interfaces) / loadFactor)
|
|
1245
|
+
buckets = [[] for i in range(size)]
|
|
1246
|
+
for iface in interfaces:
|
|
1247
|
+
# This if-statement discards interfaces specified with
|
|
1248
|
+
# "nsInterfaceName.*" that don't have any stub-able members.
|
|
1249
|
+
if iface.stubMembers:
|
|
1250
|
+
h = hashIID(iface.attributes.uuid)
|
|
1251
|
+
buckets[h % size].append(iface)
|
|
1252
|
+
|
|
1253
|
+
# Calculate where each interface's entry will show up in tableData. Where
|
|
1254
|
+
# there are hash collisions, the extra entries are added at the end of the
|
|
1255
|
+
# table.
|
|
1256
|
+
entryIndexes = {}
|
|
1257
|
+
arraySize = size
|
|
1258
|
+
for i, bucket in enumerate(buckets):
|
|
1259
|
+
if bucket:
|
|
1260
|
+
entryIndexes[bucket[0].attributes.uuid] = i
|
|
1261
|
+
for iface in bucket[1:]:
|
|
1262
|
+
entryIndexes[iface.attributes.uuid] = arraySize
|
|
1263
|
+
arraySize += 1
|
|
1264
|
+
|
|
1265
|
+
entries = [" {{0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}}, "
|
|
1266
|
+
"nsnull, nsnull, nsnull, XPC_QS_NULL_INDEX, XPC_QS_NULL_INDEX}"
|
|
1267
|
+
for i in range(arraySize)]
|
|
1268
|
+
for i, bucket in enumerate(buckets):
|
|
1269
|
+
for j, iface in enumerate(bucket):
|
|
1270
|
+
# iid field
|
|
1271
|
+
uuid = iface.attributes.uuid.lower()
|
|
1272
|
+
m = uuid_re.match(uuid)
|
|
1273
|
+
assert m is not None
|
|
1274
|
+
m0, m1, m2, m3, m4 = m.groups()
|
|
1275
|
+
m3arr = ('{0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}'
|
|
1276
|
+
% (m3[0:2], m3[2:4], m4[0:2], m4[2:4],
|
|
1277
|
+
m4[4:6], m4[6:8], m4[8:10], m4[10:12]))
|
|
1278
|
+
iid = ('{0x%s, 0x%s, 0x%s, %s}' % (m0, m1, m2, m3arr))
|
|
1279
|
+
|
|
1280
|
+
# properties field
|
|
1281
|
+
properties = "nsnull"
|
|
1282
|
+
for member in iface.stubMembers:
|
|
1283
|
+
if member.kind == 'attribute':
|
|
1284
|
+
assert not member.traceable
|
|
1285
|
+
properties = iface.name + "_properties"
|
|
1286
|
+
break
|
|
1287
|
+
|
|
1288
|
+
# member field
|
|
1289
|
+
functions = "nsnull"
|
|
1290
|
+
for member in iface.stubMembers:
|
|
1291
|
+
if member.kind == 'method' and not member.traceable:
|
|
1292
|
+
functions = iface.name + "_functions"
|
|
1293
|
+
break
|
|
1294
|
+
|
|
1295
|
+
# traceables field
|
|
1296
|
+
traceables = "nsnull"
|
|
1297
|
+
for member in iface.stubMembers:
|
|
1298
|
+
if member.traceable:
|
|
1299
|
+
traceables = iface.name + "_traceables"
|
|
1300
|
+
break
|
|
1301
|
+
|
|
1302
|
+
# parentInterface field
|
|
1303
|
+
baseName = iface.base
|
|
1304
|
+
while baseName is not None:
|
|
1305
|
+
piface = iface.idl.getName(baseName, None)
|
|
1306
|
+
k = entryIndexes.get(piface.attributes.uuid)
|
|
1307
|
+
if k is not None:
|
|
1308
|
+
parentInterface = str(k)
|
|
1309
|
+
break
|
|
1310
|
+
baseName = piface.base
|
|
1311
|
+
else:
|
|
1312
|
+
parentInterface = "XPC_QS_NULL_INDEX"
|
|
1313
|
+
|
|
1314
|
+
# chain field
|
|
1315
|
+
if j == len(bucket) - 1:
|
|
1316
|
+
chain = "XPC_QS_NULL_INDEX"
|
|
1317
|
+
else:
|
|
1318
|
+
k = entryIndexes[bucket[j+1].attributes.uuid]
|
|
1319
|
+
chain = str(k)
|
|
1320
|
+
|
|
1321
|
+
# add entry
|
|
1322
|
+
entry = " {%s, %s, %s, %s, %s, %s}" % (
|
|
1323
|
+
iid, properties, functions, traceables, parentInterface, chain)
|
|
1324
|
+
entries[entryIndexes[iface.attributes.uuid]] = entry
|
|
1325
|
+
|
|
1326
|
+
f.write("static const xpc_qsHashEntry tableData[] = {\n")
|
|
1327
|
+
f.write(",\n".join(entries))
|
|
1328
|
+
f.write("\n };\n\n")
|
|
1329
|
+
|
|
1330
|
+
# the definer function (entry point to this quick stubs file)
|
|
1331
|
+
f.write("JSBool %s_DefineQuickStubs(" % conf.name)
|
|
1332
|
+
f.write("JSContext *cx, JSObject *proto, uintN flags, PRUint32 count, "
|
|
1333
|
+
"const nsID **iids)\n"
|
|
1334
|
+
"{\n")
|
|
1335
|
+
f.write(" return xpc_qsDefineQuickStubs("
|
|
1336
|
+
"cx, proto, flags, count, iids, %d, tableData);\n" % size)
|
|
1337
|
+
f.write("}\n\n\n")
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
stubTopTemplate = '''\
|
|
1341
|
+
/* THIS FILE IS AUTOGENERATED - DO NOT EDIT */
|
|
1342
|
+
#include "jsapi.h"
|
|
1343
|
+
#include "jscntxt.h"
|
|
1344
|
+
#include "prtypes.h"
|
|
1345
|
+
#include "nsID.h"
|
|
1346
|
+
#include "%s"
|
|
1347
|
+
#include "nscore.h"
|
|
1348
|
+
#include "nsCOMPtr.h"
|
|
1349
|
+
#include "nsDependentString.h"
|
|
1350
|
+
#include "xpcprivate.h" // for XPCCallContext
|
|
1351
|
+
#include "xpcquickstubs.h"
|
|
1352
|
+
#include "jsbuiltins.h"
|
|
1353
|
+
'''
|
|
1354
|
+
|
|
1355
|
+
def writeStubFile(filename, headerFilename, conf, interfaces):
|
|
1356
|
+
print "Creating stub file", filename
|
|
1357
|
+
make_targets.append(filename)
|
|
1358
|
+
|
|
1359
|
+
f = open(filename, 'w')
|
|
1360
|
+
filesIncluded = sets.Set()
|
|
1361
|
+
|
|
1362
|
+
def includeType(type):
|
|
1363
|
+
type = unaliasType(type)
|
|
1364
|
+
if type.kind in ('builtin', 'native'):
|
|
1365
|
+
return None
|
|
1366
|
+
file = conf.irregularFilenames.get(type.name, type.name) + '.h'
|
|
1367
|
+
if file not in filesIncluded:
|
|
1368
|
+
f.write('#include "%s"\n' % file)
|
|
1369
|
+
filesIncluded.add(file)
|
|
1370
|
+
return type
|
|
1371
|
+
|
|
1372
|
+
def writeIncludesForMember(member):
|
|
1373
|
+
assert member.kind in ('attribute', 'method')
|
|
1374
|
+
resulttype = includeType(member.realtype)
|
|
1375
|
+
if member.kind == 'method':
|
|
1376
|
+
for p in member.params:
|
|
1377
|
+
includeType(p.realtype)
|
|
1378
|
+
return resulttype
|
|
1379
|
+
|
|
1380
|
+
def writeIncludesForInterface(iface):
|
|
1381
|
+
assert iface.kind == 'interface'
|
|
1382
|
+
resulttypes = []
|
|
1383
|
+
for member in iface.stubMembers:
|
|
1384
|
+
resulttype = writeIncludesForMember(member)
|
|
1385
|
+
if resulttype is not None and not isVariantType(resulttype):
|
|
1386
|
+
resulttypes.append(resulttype.name)
|
|
1387
|
+
|
|
1388
|
+
includeType(iface)
|
|
1389
|
+
|
|
1390
|
+
return resulttypes
|
|
1391
|
+
|
|
1392
|
+
try:
|
|
1393
|
+
f.write(stubTopTemplate % os.path.basename(headerFilename))
|
|
1394
|
+
N = 256
|
|
1395
|
+
for customInclude in conf.customIncludes:
|
|
1396
|
+
f.write('#include "%s"\n' % customInclude)
|
|
1397
|
+
resulttypes = []
|
|
1398
|
+
for iface in interfaces:
|
|
1399
|
+
resulttypes.extend(writeIncludesForInterface(iface))
|
|
1400
|
+
f.write("\n\n")
|
|
1401
|
+
writeResultXPCInterfacesArray(f, conf, sets.ImmutableSet(resulttypes))
|
|
1402
|
+
for iface in interfaces:
|
|
1403
|
+
writeStubsForInterface(f, conf.customMethodCalls, iface)
|
|
1404
|
+
writeDefiner(f, conf, interfaces)
|
|
1405
|
+
finally:
|
|
1406
|
+
f.close()
|
|
1407
|
+
|
|
1408
|
+
def makeQuote(filename):
|
|
1409
|
+
return filename.replace(' ', '\\ ') # enjoy!
|
|
1410
|
+
|
|
1411
|
+
def writeMakeDependOutput(filename):
|
|
1412
|
+
print "Creating makedepend file", filename
|
|
1413
|
+
f = open(filename, 'w')
|
|
1414
|
+
try:
|
|
1415
|
+
if len(make_targets) > 0:
|
|
1416
|
+
f.write("%s:" % makeQuote(make_targets[0]))
|
|
1417
|
+
for filename in make_dependencies:
|
|
1418
|
+
f.write(' \\\n\t\t%s' % makeQuote(filename))
|
|
1419
|
+
f.write('\n\n')
|
|
1420
|
+
for filename in make_targets[1:]:
|
|
1421
|
+
f.write('%s: %s\n' % (makeQuote(filename), makeQuote(make_targets[0])))
|
|
1422
|
+
finally:
|
|
1423
|
+
f.close()
|
|
1424
|
+
|
|
1425
|
+
def main():
|
|
1426
|
+
from optparse import OptionParser
|
|
1427
|
+
o = OptionParser(usage="usage: %prog [options] configfile")
|
|
1428
|
+
o.add_option('-o', "--stub-output",
|
|
1429
|
+
type='string', dest='stub_output', default=None,
|
|
1430
|
+
help="Quick stub C++ source output file", metavar="FILE")
|
|
1431
|
+
o.add_option('--header-output', type='string', default=None,
|
|
1432
|
+
help="Quick stub header output file", metavar="FILE")
|
|
1433
|
+
o.add_option('--makedepend-output', type='string', default=None,
|
|
1434
|
+
help="gnumake dependencies output file", metavar="FILE")
|
|
1435
|
+
o.add_option('--idlpath', type='string', default='.',
|
|
1436
|
+
help="colon-separated directories to search for idl files",
|
|
1437
|
+
metavar="PATH")
|
|
1438
|
+
o.add_option('--cachedir', dest='cachedir', default='',
|
|
1439
|
+
help="Directory in which to cache lex/parse tables.")
|
|
1440
|
+
o.add_option("--verbose-errors", action='store_true', default=False,
|
|
1441
|
+
help="When an error happens, display the Python traceback.")
|
|
1442
|
+
o.add_option("--enable-traceables", action='store_true', default=False,
|
|
1443
|
+
help="Whether or not traceable methods are generated.")
|
|
1444
|
+
(options, filenames) = o.parse_args()
|
|
1445
|
+
|
|
1446
|
+
if len(filenames) != 1:
|
|
1447
|
+
o.error("Exactly one config filename is needed.")
|
|
1448
|
+
filename = filenames[0]
|
|
1449
|
+
|
|
1450
|
+
if options.stub_output is None:
|
|
1451
|
+
if filename.endswith('.qsconf') or filename.endswith('.py'):
|
|
1452
|
+
options.stub_output = filename.rsplit('.', 1)[0] + '.cpp'
|
|
1453
|
+
else:
|
|
1454
|
+
options.stub_output = filename + '.cpp'
|
|
1455
|
+
if options.header_output is None:
|
|
1456
|
+
options.header_output = re.sub(r'(\.c|\.cpp)?$', '.h',
|
|
1457
|
+
options.stub_output)
|
|
1458
|
+
|
|
1459
|
+
if options.cachedir != '':
|
|
1460
|
+
sys.path.append(options.cachedir)
|
|
1461
|
+
if not os.path.isdir(options.cachedir):
|
|
1462
|
+
os.mkdir(options.cachedir)
|
|
1463
|
+
|
|
1464
|
+
try:
|
|
1465
|
+
includePath = options.idlpath.split(':')
|
|
1466
|
+
conf, interfaces = readConfigFile(filename,
|
|
1467
|
+
includePath=includePath,
|
|
1468
|
+
cachedir=options.cachedir,
|
|
1469
|
+
traceable=options.enable_traceables)
|
|
1470
|
+
writeHeaderFile(options.header_output, conf.name)
|
|
1471
|
+
writeStubFile(options.stub_output, options.header_output,
|
|
1472
|
+
conf, interfaces)
|
|
1473
|
+
if options.makedepend_output is not None:
|
|
1474
|
+
writeMakeDependOutput(options.makedepend_output)
|
|
1475
|
+
except Exception, exc:
|
|
1476
|
+
if options.verbose_errors:
|
|
1477
|
+
raise
|
|
1478
|
+
elif isinstance(exc, (UserError, xpidl.IDLError)):
|
|
1479
|
+
warn(str(exc))
|
|
1480
|
+
elif isinstance(exc, OSError):
|
|
1481
|
+
warn("%s: %s" % (exc.__class__.__name__, exc))
|
|
1482
|
+
else:
|
|
1483
|
+
raise
|
|
1484
|
+
sys.exit(1)
|
|
1485
|
+
|
|
1486
|
+
if __name__ == '__main__':
|
|
1487
|
+
main()
|