distil 0.7.0
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/Rakefile +28 -0
- data/VERSION +1 -0
- data/bin/distil +45 -0
- data/distil.gemspec +586 -0
- data/lib/bootstrap-template.js +56 -0
- data/lib/configurable.rb +125 -0
- data/lib/file-set.rb +42 -0
- data/lib/file-types/css-file.rb +75 -0
- data/lib/file-types/html-file.rb +11 -0
- data/lib/file-types/javascript-file.rb +98 -0
- data/lib/file-types/json-file.rb +14 -0
- data/lib/file-types/nib-file.rb +9 -0
- data/lib/jsdoc.conf +18 -0
- data/lib/jsl.conf +121 -0
- data/lib/project.rb +96 -0
- data/lib/source-file.rb +181 -0
- data/lib/target.rb +96 -0
- data/lib/task.rb +239 -0
- data/lib/tasks/copy-task.rb +21 -0
- data/lib/tasks/css-task.rb +18 -0
- data/lib/tasks/javascript-task.rb +125 -0
- data/lib/tasks/multiple-output-task.rb +134 -0
- data/lib/tasks/nib-task.rb +83 -0
- data/lib/tasks/output-task.rb +73 -0
- data/lib/tasks/single-output-task.rb +83 -0
- data/lib/tasks/test-task.rb +280 -0
- data/lib/test/HtmlTestReporter.js +127 -0
- data/lib/test/Test.js +248 -0
- data/lib/test/TestReporter.js +79 -0
- data/lib/test/TestRunner.js +132 -0
- data/lib/test/browser.rb +97 -0
- data/lib/test/scriptwrapper.html +10 -0
- data/lib/test/unittest.html +127 -0
- data/vendor/Makefile +35 -0
- data/vendor/extconf.rb +3 -0
- data/vendor/jsdoc-extras/plugins/distil-plugin.js +142 -0
- data/vendor/jsdoc-extras/plugins/interface-plugin.js +36 -0
- data/vendor/jsdoc-extras/templates/coherent/allclasses.tmpl +17 -0
- data/vendor/jsdoc-extras/templates/coherent/allfiles.tmpl +53 -0
- data/vendor/jsdoc-extras/templates/coherent/class.tmpl +803 -0
- data/vendor/jsdoc-extras/templates/coherent/index.tmpl +37 -0
- data/vendor/jsdoc-extras/templates/coherent/publish.js +242 -0
- data/vendor/jsdoc-extras/templates/coherent/showdown.js +421 -0
- data/vendor/jsdoc-extras/templates/coherent/static/code-footer.html +3 -0
- data/vendor/jsdoc-extras/templates/coherent/static/code-header.html +7 -0
- data/vendor/jsdoc-extras/templates/coherent/static/default.css +297 -0
- data/vendor/jsdoc-extras/templates/coherent/static/header.html +2 -0
- data/vendor/jsdoc-extras/templates/coherent/static/index.html +19 -0
- data/vendor/jsdoc-extras/templates/coherent/symbol.tmpl +35 -0
- data/vendor/jsdoc-toolkit/README.txt +183 -0
- data/vendor/jsdoc-toolkit/app/frame/Chain.js +102 -0
- data/vendor/jsdoc-toolkit/app/frame/Dumper.js +144 -0
- data/vendor/jsdoc-toolkit/app/frame/Hash.js +84 -0
- data/vendor/jsdoc-toolkit/app/frame/Link.js +171 -0
- data/vendor/jsdoc-toolkit/app/frame/Namespace.js +10 -0
- data/vendor/jsdoc-toolkit/app/frame/Opt.js +134 -0
- data/vendor/jsdoc-toolkit/app/frame/Reflection.js +26 -0
- data/vendor/jsdoc-toolkit/app/frame/String.js +93 -0
- data/vendor/jsdoc-toolkit/app/frame/Testrun.js +129 -0
- data/vendor/jsdoc-toolkit/app/frame.js +33 -0
- data/vendor/jsdoc-toolkit/app/handlers/FOODOC.js +26 -0
- data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +159 -0
- data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +16 -0
- data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +292 -0
- data/vendor/jsdoc-toolkit/app/handlers/XMLDOC.js +26 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +204 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +300 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +126 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +109 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/Lang.js +144 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/Parser.js +144 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +33 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +644 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +241 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +41 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/Token.js +18 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +332 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +133 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/Util.js +32 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC/Walker.js +499 -0
- data/vendor/jsdoc-toolkit/app/lib/JSDOC.js +106 -0
- data/vendor/jsdoc-toolkit/app/main.js +129 -0
- data/vendor/jsdoc-toolkit/app/plugins/commentSrcJson.js +20 -0
- data/vendor/jsdoc-toolkit/app/plugins/frameworkPrototype.js +16 -0
- data/vendor/jsdoc-toolkit/app/plugins/functionCall.js +10 -0
- data/vendor/jsdoc-toolkit/app/plugins/publishSrcHilite.js +54 -0
- data/vendor/jsdoc-toolkit/app/plugins/symbolLink.js +10 -0
- data/vendor/jsdoc-toolkit/app/plugins/tagParamConfig.js +31 -0
- data/vendor/jsdoc-toolkit/app/plugins/tagSynonyms.js +43 -0
- data/vendor/jsdoc-toolkit/app/run.js +348 -0
- data/vendor/jsdoc-toolkit/app/t/TestDoc.js +144 -0
- data/vendor/jsdoc-toolkit/app/t/runner.js +13 -0
- data/vendor/jsdoc-toolkit/app/test/addon.js +24 -0
- data/vendor/jsdoc-toolkit/app/test/anon_inner.js +14 -0
- data/vendor/jsdoc-toolkit/app/test/augments.js +31 -0
- data/vendor/jsdoc-toolkit/app/test/augments2.js +26 -0
- data/vendor/jsdoc-toolkit/app/test/borrows.js +46 -0
- data/vendor/jsdoc-toolkit/app/test/borrows2.js +23 -0
- data/vendor/jsdoc-toolkit/app/test/config.js +22 -0
- data/vendor/jsdoc-toolkit/app/test/constructs.js +18 -0
- data/vendor/jsdoc-toolkit/app/test/encoding.js +10 -0
- data/vendor/jsdoc-toolkit/app/test/encoding_other.js +12 -0
- data/vendor/jsdoc-toolkit/app/test/event.js +54 -0
- data/vendor/jsdoc-toolkit/app/test/exports.js +14 -0
- data/vendor/jsdoc-toolkit/app/test/functions_anon.js +39 -0
- data/vendor/jsdoc-toolkit/app/test/functions_nested.js +33 -0
- data/vendor/jsdoc-toolkit/app/test/global.js +13 -0
- data/vendor/jsdoc-toolkit/app/test/globals.js +25 -0
- data/vendor/jsdoc-toolkit/app/test/ignore.js +10 -0
- data/vendor/jsdoc-toolkit/app/test/inner.js +16 -0
- data/vendor/jsdoc-toolkit/app/test/jsdoc_test.js +477 -0
- data/vendor/jsdoc-toolkit/app/test/lend.js +33 -0
- data/vendor/jsdoc-toolkit/app/test/memberof.js +19 -0
- data/vendor/jsdoc-toolkit/app/test/memberof2.js +38 -0
- data/vendor/jsdoc-toolkit/app/test/memberof3.js +33 -0
- data/vendor/jsdoc-toolkit/app/test/memberof_constructor.js +17 -0
- data/vendor/jsdoc-toolkit/app/test/module.js +17 -0
- data/vendor/jsdoc-toolkit/app/test/name.js +19 -0
- data/vendor/jsdoc-toolkit/app/test/namespace_nested.js +23 -0
- data/vendor/jsdoc-toolkit/app/test/nocode.js +13 -0
- data/vendor/jsdoc-toolkit/app/test/oblit_anon.js +20 -0
- data/vendor/jsdoc-toolkit/app/test/overview.js +20 -0
- data/vendor/jsdoc-toolkit/app/test/param_inline.js +37 -0
- data/vendor/jsdoc-toolkit/app/test/params_optional.js +8 -0
- data/vendor/jsdoc-toolkit/app/test/prototype.js +17 -0
- data/vendor/jsdoc-toolkit/app/test/prototype_nested.js +9 -0
- data/vendor/jsdoc-toolkit/app/test/prototype_oblit.js +13 -0
- data/vendor/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +24 -0
- data/vendor/jsdoc-toolkit/app/test/public.js +10 -0
- data/vendor/jsdoc-toolkit/app/test/scripts/code.js +5 -0
- data/vendor/jsdoc-toolkit/app/test/scripts/notcode.txt +5 -0
- data/vendor/jsdoc-toolkit/app/test/shared.js +42 -0
- data/vendor/jsdoc-toolkit/app/test/shared2.js +2 -0
- data/vendor/jsdoc-toolkit/app/test/shortcuts.js +22 -0
- data/vendor/jsdoc-toolkit/app/test/static_this.js +13 -0
- data/vendor/jsdoc-toolkit/app/test/synonyms.js +31 -0
- data/vendor/jsdoc-toolkit/app/test/tosource.js +23 -0
- data/vendor/jsdoc-toolkit/app/test/variable_redefine.js +14 -0
- data/vendor/jsdoc-toolkit/app/test.js +342 -0
- data/vendor/jsdoc-toolkit/changes.txt +116 -0
- data/vendor/jsdoc-toolkit/conf/sample.conf +31 -0
- data/vendor/jsdoc-toolkit/java/build.xml +36 -0
- data/vendor/jsdoc-toolkit/java/build_1.4.xml +36 -0
- data/vendor/jsdoc-toolkit/java/classes/js.jar +0 -0
- data/vendor/jsdoc-toolkit/java/src/JsDebugRun.java +21 -0
- data/vendor/jsdoc-toolkit/java/src/JsRun.java +21 -0
- data/vendor/jsdoc-toolkit/jsdebug.jar +0 -0
- data/vendor/jsdoc-toolkit/jsrun.jar +0 -0
- data/vendor/jsdoc-toolkit/jsrun.sh +53 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +17 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +56 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/class.tmpl +649 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/index.tmpl +39 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/publish.js +201 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/static/code-footer.html +3 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/static/code-header.html +14 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/static/default.css +162 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/static/header.html +2 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/static/index.html +19 -0
- data/vendor/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +35 -0
- data/vendor/jsl-0.3.0/src/JavaScriptLintAPI.cpp +333 -0
- data/vendor/jsl-0.3.0/src/JavaScriptLintAPI.h +86 -0
- data/vendor/jsl-0.3.0/src/Makefile.in +375 -0
- data/vendor/jsl-0.3.0/src/Makefile.ref +372 -0
- data/vendor/jsl-0.3.0/src/README.html +826 -0
- data/vendor/jsl-0.3.0/src/SpiderMonkey.rsp +12 -0
- data/vendor/jsl-0.3.0/src/_jsl_online.php +223 -0
- data/vendor/jsl-0.3.0/src/config/AIX4.1.mk +65 -0
- data/vendor/jsl-0.3.0/src/config/AIX4.2.mk +64 -0
- data/vendor/jsl-0.3.0/src/config/AIX4.3.mk +65 -0
- data/vendor/jsl-0.3.0/src/config/Darwin.mk +81 -0
- data/vendor/jsl-0.3.0/src/config/Darwin1.3.mk +81 -0
- data/vendor/jsl-0.3.0/src/config/Darwin1.4.mk +41 -0
- data/vendor/jsl-0.3.0/src/config/Darwin5.2.mk +81 -0
- data/vendor/jsl-0.3.0/src/config/Darwin5.3.mk +81 -0
- data/vendor/jsl-0.3.0/src/config/HP-UXB.10.10.mk +77 -0
- data/vendor/jsl-0.3.0/src/config/HP-UXB.10.20.mk +77 -0
- data/vendor/jsl-0.3.0/src/config/HP-UXB.11.00.mk +80 -0
- data/vendor/jsl-0.3.0/src/config/IRIX.mk +87 -0
- data/vendor/jsl-0.3.0/src/config/IRIX5.3.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/IRIX6.1.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/IRIX6.2.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/IRIX6.3.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/IRIX6.5.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/Linux_All.mk +103 -0
- data/vendor/jsl-0.3.0/src/config/Mac_OS10.0.mk +82 -0
- data/vendor/jsl-0.3.0/src/config/OSF1V4.0.mk +72 -0
- data/vendor/jsl-0.3.0/src/config/OSF1V5.0.mk +69 -0
- data/vendor/jsl-0.3.0/src/config/SunOS4.1.4.mk +101 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.3.mk +91 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.4.mk +92 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.5.1.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.5.mk +87 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.6.mk +89 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.7.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.8.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/SunOS5.9.mk +44 -0
- data/vendor/jsl-0.3.0/src/config/WINNT4.0.mk +112 -0
- data/vendor/jsl-0.3.0/src/config/WINNT5.0.mk +112 -0
- data/vendor/jsl-0.3.0/src/config/WINNT5.1.mk +112 -0
- data/vendor/jsl-0.3.0/src/config/WINNT5.2.mk +112 -0
- data/vendor/jsl-0.3.0/src/config/dgux.mk +64 -0
- data/vendor/jsl-0.3.0/src/config.mk +166 -0
- data/vendor/jsl-0.3.0/src/editline/Makefile.ref +144 -0
- data/vendor/jsl-0.3.0/src/editline/README +83 -0
- data/vendor/jsl-0.3.0/src/editline/editline.3 +175 -0
- data/vendor/jsl-0.3.0/src/editline/editline.c +1369 -0
- data/vendor/jsl-0.3.0/src/editline/editline.h +135 -0
- data/vendor/jsl-0.3.0/src/editline/sysunix.c +182 -0
- data/vendor/jsl-0.3.0/src/editline/unix.h +82 -0
- data/vendor/jsl-0.3.0/src/fdlibm/Makefile.in +127 -0
- data/vendor/jsl-0.3.0/src/fdlibm/Makefile.ref +192 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_acos.c +147 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_acosh.c +105 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_asin.c +156 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_atan2.c +165 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_atanh.c +110 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_cosh.c +133 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_exp.c +202 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_fmod.c +184 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_gamma.c +71 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_gamma_r.c +70 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_hypot.c +173 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_j0.c +524 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_j1.c +523 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_jn.c +315 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_lgamma.c +71 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_lgamma_r.c +347 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_log.c +184 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_log10.c +134 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_pow.c +386 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_rem_pio2.c +221 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_remainder.c +120 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_scalb.c +89 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_sinh.c +122 -0
- data/vendor/jsl-0.3.0/src/fdlibm/e_sqrt.c +497 -0
- data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.dsp +160 -0
- data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.h +273 -0
- data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.mak +1453 -0
- data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.mdp +0 -0
- data/vendor/jsl-0.3.0/src/fdlibm/k_cos.c +134 -0
- data/vendor/jsl-0.3.0/src/fdlibm/k_rem_pio2.c +354 -0
- data/vendor/jsl-0.3.0/src/fdlibm/k_sin.c +114 -0
- data/vendor/jsl-0.3.0/src/fdlibm/k_standard.c +785 -0
- data/vendor/jsl-0.3.0/src/fdlibm/k_tan.c +170 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_asinh.c +101 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_atan.c +175 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_cbrt.c +133 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_ceil.c +120 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_copysign.c +72 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_cos.c +118 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_erf.c +356 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_expm1.c +267 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_fabs.c +70 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_finite.c +71 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_floor.c +121 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_frexp.c +99 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_ilogb.c +85 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_isnan.c +74 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_ldexp.c +66 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_lib_version.c +73 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_log1p.c +211 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_logb.c +79 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_matherr.c +64 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_modf.c +132 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_nextafter.c +124 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_rint.c +131 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_scalbn.c +107 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_signgam.c +40 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_significand.c +68 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_sin.c +118 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_tan.c +112 -0
- data/vendor/jsl-0.3.0/src/fdlibm/s_tanh.c +122 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_acos.c +78 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_acosh.c +78 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_asin.c +80 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_atan2.c +79 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_atanh.c +81 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_cosh.c +77 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_exp.c +88 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_fmod.c +78 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_gamma.c +85 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_gamma_r.c +81 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_hypot.c +78 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_j0.c +105 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_j1.c +106 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_jn.c +128 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_lgamma.c +85 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_lgamma_r.c +81 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_log.c +78 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_log10.c +81 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_pow.c +99 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_remainder.c +77 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_scalb.c +95 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_sinh.c +77 -0
- data/vendor/jsl-0.3.0/src/fdlibm/w_sqrt.c +77 -0
- data/vendor/jsl-0.3.0/src/js.c +2447 -0
- data/vendor/jsl-0.3.0/src/js.dsp +420 -0
- data/vendor/jsl-0.3.0/src/js.mak +4025 -0
- data/vendor/jsl-0.3.0/src/js.mdp +0 -0
- data/vendor/jsl-0.3.0/src/js.msg +291 -0
- data/vendor/jsl-0.3.0/src/js.pkg +2 -0
- data/vendor/jsl-0.3.0/src/js3240.rc +79 -0
- data/vendor/jsl-0.3.0/src/jsOS240.def +654 -0
- data/vendor/jsl-0.3.0/src/jsapi.c +4405 -0
- data/vendor/jsl-0.3.0/src/jsapi.h +1856 -0
- data/vendor/jsl-0.3.0/src/jsarena.c +567 -0
- data/vendor/jsl-0.3.0/src/jsarena.h +302 -0
- data/vendor/jsl-0.3.0/src/jsarray.c +1428 -0
- data/vendor/jsl-0.3.0/src/jsarray.h +77 -0
- data/vendor/jsl-0.3.0/src/jsatom.c +927 -0
- data/vendor/jsl-0.3.0/src/jsatom.h +426 -0
- data/vendor/jsl-0.3.0/src/jsbit.h +113 -0
- data/vendor/jsl-0.3.0/src/jsbool.c +220 -0
- data/vendor/jsl-0.3.0/src/jsbool.h +62 -0
- data/vendor/jsl-0.3.0/src/jsclist.h +139 -0
- data/vendor/jsl-0.3.0/src/jscntxt.c +1036 -0
- data/vendor/jsl-0.3.0/src/jscntxt.h +608 -0
- data/vendor/jsl-0.3.0/src/jscompat.h +57 -0
- data/vendor/jsl-0.3.0/src/jsconfig.h +489 -0
- data/vendor/jsl-0.3.0/src/jsconfig.mk +181 -0
- data/vendor/jsl-0.3.0/src/jscpucfg.c +377 -0
- data/vendor/jsl-0.3.0/src/jscpucfg.h +204 -0
- data/vendor/jsl-0.3.0/src/jsdate.c +2238 -0
- data/vendor/jsl-0.3.0/src/jsdate.h +118 -0
- data/vendor/jsl-0.3.0/src/jsdbgapi.c +1260 -0
- data/vendor/jsl-0.3.0/src/jsdbgapi.h +345 -0
- data/vendor/jsl-0.3.0/src/jsdhash.c +763 -0
- data/vendor/jsl-0.3.0/src/jsdhash.h +579 -0
- data/vendor/jsl-0.3.0/src/jsdtoa.c +3135 -0
- data/vendor/jsl-0.3.0/src/jsdtoa.h +130 -0
- data/vendor/jsl-0.3.0/src/jsemit.c +4851 -0
- data/vendor/jsl-0.3.0/src/jsemit.h +576 -0
- data/vendor/jsl-0.3.0/src/jsexn.c +1084 -0
- data/vendor/jsl-0.3.0/src/jsexn.h +102 -0
- data/vendor/jsl-0.3.0/src/jsfile.c +2610 -0
- data/vendor/jsl-0.3.0/src/jsfile.h +50 -0
- data/vendor/jsl-0.3.0/src/jsfile.msg +89 -0
- data/vendor/jsl-0.3.0/src/jsfun.c +2015 -0
- data/vendor/jsl-0.3.0/src/jsfun.h +158 -0
- data/vendor/jsl-0.3.0/src/jsgc.c +1441 -0
- data/vendor/jsl-0.3.0/src/jsgc.h +230 -0
- data/vendor/jsl-0.3.0/src/jshash.c +471 -0
- data/vendor/jsl-0.3.0/src/jshash.h +152 -0
- data/vendor/jsl-0.3.0/src/jsify.pl +485 -0
- data/vendor/jsl-0.3.0/src/jsinterp.c +4797 -0
- data/vendor/jsl-0.3.0/src/jsinterp.h +302 -0
- data/vendor/jsl-0.3.0/src/jsl-test.js +28 -0
- data/vendor/jsl-0.3.0/src/jsl.c +2371 -0
- data/vendor/jsl-0.3.0/src/jsl.conf +127 -0
- data/vendor/jsl-0.3.0/src/jsl.conf.old +124 -0
- data/vendor/jsl-0.3.0/src/jsl.dsp +242 -0
- data/vendor/jsl-0.3.0/src/jsl.dsw +59 -0
- data/vendor/jsl-0.3.0/src/jslibmath.h +290 -0
- data/vendor/jsl-0.3.0/src/jslock.c +1261 -0
- data/vendor/jsl-0.3.0/src/jslock.h +289 -0
- data/vendor/jsl-0.3.0/src/jslocko.asm +59 -0
- data/vendor/jsl-0.3.0/src/jslog2.c +83 -0
- data/vendor/jsl-0.3.0/src/jslong.c +281 -0
- data/vendor/jsl-0.3.0/src/jslong.h +437 -0
- data/vendor/jsl-0.3.0/src/jsmath.c +477 -0
- data/vendor/jsl-0.3.0/src/jsmath.h +55 -0
- data/vendor/jsl-0.3.0/src/jsnum.c +1148 -0
- data/vendor/jsl-0.3.0/src/jsnum.h +257 -0
- data/vendor/jsl-0.3.0/src/jsobj.c +4066 -0
- data/vendor/jsl-0.3.0/src/jsobj.h +475 -0
- data/vendor/jsl-0.3.0/src/jsopcode.c +2730 -0
- data/vendor/jsl-0.3.0/src/jsopcode.h +275 -0
- data/vendor/jsl-0.3.0/src/jsopcode.tbl +344 -0
- data/vendor/jsl-0.3.0/src/jsosdep.h +127 -0
- data/vendor/jsl-0.3.0/src/jsotypes.h +211 -0
- data/vendor/jsl-0.3.0/src/jsparse.c +4438 -0
- data/vendor/jsl-0.3.0/src/jsparse.h +345 -0
- data/vendor/jsl-0.3.0/src/jsprf.c +1212 -0
- data/vendor/jsl-0.3.0/src/jsprf.h +148 -0
- data/vendor/jsl-0.3.0/src/jsprvtd.h +174 -0
- data/vendor/jsl-0.3.0/src/jspubtd.h +586 -0
- data/vendor/jsl-0.3.0/src/jsregexp.c +3831 -0
- data/vendor/jsl-0.3.0/src/jsregexp.h +180 -0
- data/vendor/jsl-0.3.0/src/jsscan.c +1814 -0
- data/vendor/jsl-0.3.0/src/jsscan.h +267 -0
- data/vendor/jsl-0.3.0/src/jsscope.c +1639 -0
- data/vendor/jsl-0.3.0/src/jsscope.h +389 -0
- data/vendor/jsl-0.3.0/src/jsscript.c +1284 -0
- data/vendor/jsl-0.3.0/src/jsscript.h +179 -0
- data/vendor/jsl-0.3.0/src/jsshell.msg +50 -0
- data/vendor/jsl-0.3.0/src/jsstddef.h +83 -0
- data/vendor/jsl-0.3.0/src/jsstr.c +4502 -0
- data/vendor/jsl-0.3.0/src/jsstr.h +448 -0
- data/vendor/jsl-0.3.0/src/jstypes.h +391 -0
- data/vendor/jsl-0.3.0/src/jsutil.c +157 -0
- data/vendor/jsl-0.3.0/src/jsutil.h +75 -0
- data/vendor/jsl-0.3.0/src/jsxdrapi.c +686 -0
- data/vendor/jsl-0.3.0/src/jsxdrapi.h +193 -0
- data/vendor/jsl-0.3.0/src/liveconnect/LiveConnect.dsp +157 -0
- data/vendor/jsl-0.3.0/src/liveconnect/LiveConnectShell.dsp +120 -0
- data/vendor/jsl-0.3.0/src/liveconnect/LiveConnectShell.dsw +44 -0
- data/vendor/jsl-0.3.0/src/liveconnect/Makefile.in +106 -0
- data/vendor/jsl-0.3.0/src/liveconnect/Makefile.ref +169 -0
- data/vendor/jsl-0.3.0/src/liveconnect/README.html +719 -0
- data/vendor/jsl-0.3.0/src/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
- data/vendor/jsl-0.3.0/src/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/Makefile.in +89 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/Makefile.ref +57 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/Makefile.ref +47 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSException.java +140 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
- data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.1.mk +45 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.2.mk +45 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.3.mk +50 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.10.10.mk +43 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.10.20.mk +43 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.11.00.mk +43 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.2.mk +43 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.3.mk +43 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.5.mk +43 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/Linux_All.mk +73 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/OSF1V4.0.mk +65 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/OSF1V5.0.mk +62 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.5.1.mk +55 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.6.mk +39 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.7.mk +39 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.8.mk +39 -0
- data/vendor/jsl-0.3.0/src/liveconnect/config/WINNT4.0.mk +53 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj.c +884 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj.msg +98 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_JSObject.c +1379 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaArray.c +481 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaClass.c +749 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaMember.c +186 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaObject.c +1099 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaPackage.c +548 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_array.c +207 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_class.c +765 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_convert.c +954 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_field.c +421 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_hash.c +504 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_hash.h +161 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_method.c +1823 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_nodl.c +1 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_private.h +689 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_simpleapi.c +219 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsj_utils.c +513 -0
- data/vendor/jsl-0.3.0/src/liveconnect/jsjava.h +313 -0
- data/vendor/jsl-0.3.0/src/liveconnect/liveconnect.pkg +3 -0
- data/vendor/jsl-0.3.0/src/liveconnect/netscape_javascript_JSObject.h +155 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnect.cpp +785 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnect.h +197 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnectFactory.cpp +163 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnectFactory.h +76 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsILiveconnect.h +195 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsISecureLiveconnect.h +84 -0
- data/vendor/jsl-0.3.0/src/liveconnect/nsISecurityContext.h +135 -0
- data/vendor/jsl-0.3.0/src/liveconnect/win32.order +6 -0
- data/vendor/jsl-0.3.0/src/lock_SunOS.s +114 -0
- data/vendor/jsl-0.3.0/src/perfect.js +39 -0
- data/vendor/jsl-0.3.0/src/perlconnect/JS.def +6 -0
- data/vendor/jsl-0.3.0/src/perlconnect/JS.dsp +107 -0
- data/vendor/jsl-0.3.0/src/perlconnect/JS.pm +318 -0
- data/vendor/jsl-0.3.0/src/perlconnect/JS.xs +1050 -0
- data/vendor/jsl-0.3.0/src/perlconnect/Makefile.PL +67 -0
- data/vendor/jsl-0.3.0/src/perlconnect/Makefile.ref +152 -0
- data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.dsp +103 -0
- data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.dsw +59 -0
- data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.pm +126 -0
- data/vendor/jsl-0.3.0/src/perlconnect/PerlConnectShell.dsp +89 -0
- data/vendor/jsl-0.3.0/src/perlconnect/README.html +345 -0
- data/vendor/jsl-0.3.0/src/perlconnect/bg.jpg +0 -0
- data/vendor/jsl-0.3.0/src/perlconnect/jsperl.c +1100 -0
- data/vendor/jsl-0.3.0/src/perlconnect/jsperl.h +52 -0
- data/vendor/jsl-0.3.0/src/perlconnect/jsperlbuild.pl +81 -0
- data/vendor/jsl-0.3.0/src/perlconnect/jsperlpvt.h +57 -0
- data/vendor/jsl-0.3.0/src/perlconnect/test.js +73 -0
- data/vendor/jsl-0.3.0/src/perlconnect/test.pl +244 -0
- data/vendor/jsl-0.3.0/src/perlconnect/typemap +121 -0
- data/vendor/jsl-0.3.0/src/plify_jsdhash.sed +31 -0
- data/vendor/jsl-0.3.0/src/prmjtime.c +646 -0
- data/vendor/jsl-0.3.0/src/prmjtime.h +95 -0
- data/vendor/jsl-0.3.0/src/resource.h +15 -0
- data/vendor/jsl-0.3.0/src/rules.mk +193 -0
- data/vendor/jsl-0.3.0/src/win32.order +391 -0
- data/vendor/jsl-0.3.0/tests/conf/always_use_option_explicit.js +4 -0
- data/vendor/jsl-0.3.0/tests/conf/define.js +8 -0
- data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-1.js +7 -0
- data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-2.js +8 -0
- data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-3.js +27 -0
- data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-4.js +4 -0
- data/vendor/jsl-0.3.0/tests/conf/lambda_assign_requires_semicolon.js +24 -0
- data/vendor/jsl-0.3.0/tests/conf/legacy_control_comments.js +8 -0
- data/vendor/jsl-0.3.0/tests/control_comments/control_comments.js +33 -0
- data/vendor/jsl-0.3.0/tests/control_comments/declare.js +26 -0
- data/vendor/jsl-0.3.0/tests/control_comments/import-overflow.js +9 -0
- data/vendor/jsl-0.3.0/tests/control_comments/import.js +5 -0
- data/vendor/jsl-0.3.0/tests/control_comments/import2.js +2 -0
- data/vendor/jsl-0.3.0/tests/control_comments/invalid_fallthru.js +13 -0
- data/vendor/jsl-0.3.0/tests/control_comments/option_explicit-with.js +12 -0
- data/vendor/jsl-0.3.0/tests/control_comments/option_explicit.js +64 -0
- data/vendor/jsl-0.3.0/tests/errors/unterminated_comment.js +8 -0
- data/vendor/jsl-0.3.0/tests/html/script_tag_in_js_literal.html +14 -0
- data/vendor/jsl-0.3.0/tests/run_tests.pl +71 -0
- data/vendor/jsl-0.3.0/tests/warnings/ambiguous_else_stmt.js +21 -0
- data/vendor/jsl-0.3.0/tests/warnings/ambiguous_nested_stmt.js +66 -0
- data/vendor/jsl-0.3.0/tests/warnings/ambiguous_newline.js +261 -0
- data/vendor/jsl-0.3.0/tests/warnings/anon_no_return_value.js +26 -0
- data/vendor/jsl-0.3.0/tests/warnings/assign_to_function_call.js +16 -0
- data/vendor/jsl-0.3.0/tests/warnings/block_without_braces.js +13 -0
- data/vendor/jsl-0.3.0/tests/warnings/comma_separated_stmts.js +17 -0
- data/vendor/jsl-0.3.0/tests/warnings/comparison_type_conv.js +44 -0
- data/vendor/jsl-0.3.0/tests/warnings/default_not_at_end.js +15 -0
- data/vendor/jsl-0.3.0/tests/warnings/dup_option_explicit.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/duplicate_case_in_switch.js +62 -0
- data/vendor/jsl-0.3.0/tests/warnings/duplicate_formal.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/empty_statement.js +29 -0
- data/vendor/jsl-0.3.0/tests/warnings/equal_as_assign.js +7 -0
- data/vendor/jsl-0.3.0/tests/warnings/inc_dec_within_stmt-ignore.js +21 -0
- data/vendor/jsl-0.3.0/tests/warnings/inc_dec_within_stmt.js +63 -0
- data/vendor/jsl-0.3.0/tests/warnings/jsl_cc_not_understood.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/leading_decimal_point.js +7 -0
- data/vendor/jsl-0.3.0/tests/warnings/legacy_cc_not_understood.js +9 -0
- data/vendor/jsl-0.3.0/tests/warnings/meaningless_block.js +12 -0
- data/vendor/jsl-0.3.0/tests/warnings/misplaced_regex.js +20 -0
- data/vendor/jsl-0.3.0/tests/warnings/missing_break.js +87 -0
- data/vendor/jsl-0.3.0/tests/warnings/missing_break_for_last_case.js +19 -0
- data/vendor/jsl-0.3.0/tests/warnings/missing_default_case.js +51 -0
- data/vendor/jsl-0.3.0/tests/warnings/missing_option_explicit.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/missing_semicolon.js +19 -0
- data/vendor/jsl-0.3.0/tests/warnings/multiple_plus_minus.js +10 -0
- data/vendor/jsl-0.3.0/tests/warnings/nested_comment.js +6 -0
- data/vendor/jsl-0.3.0/tests/warnings/no_return_value.js +25 -0
- data/vendor/jsl-0.3.0/tests/warnings/octal_number.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/parseint_missing_radix.js +15 -0
- data/vendor/jsl-0.3.0/tests/warnings/partial_option_explicit.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/redeclared_var.js +10 -0
- data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/bad_backref.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/deprecated_usage.js +11 -0
- data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/invalid_backref.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/trailing_comma.js +5 -0
- data/vendor/jsl-0.3.0/tests/warnings/trailing_comma_in_array.js +8 -0
- data/vendor/jsl-0.3.0/tests/warnings/trailing_decimal_point.js +7 -0
- data/vendor/jsl-0.3.0/tests/warnings/unreachable_code.js +29 -0
- data/vendor/jsl-0.3.0/tests/warnings/use_of_label.js +19 -0
- data/vendor/jsl-0.3.0/tests/warnings/useless_assign.js +20 -0
- data/vendor/jsl-0.3.0/tests/warnings/useless_comparison.js +55 -0
- data/vendor/jsl-0.3.0/tests/warnings/useless_void.js +6 -0
- data/vendor/jsl-0.3.0/tests/warnings/var_hides_arg.js +4 -0
- data/vendor/jsl-0.3.0/tests/warnings/with_statement.js +7 -0
- data/vendor/yuicompressor-2.4.2.jar +0 -0
- metadata +605 -0
|
@@ -0,0 +1,1099 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
2
|
+
*
|
|
3
|
+
* ***** BEGIN LICENSE BLOCK *****
|
|
4
|
+
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
5
|
+
*
|
|
6
|
+
* The contents of this file are subject to the Mozilla Public License Version
|
|
7
|
+
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
8
|
+
* the License. You may obtain a copy of the License at
|
|
9
|
+
* http://www.mozilla.org/MPL/
|
|
10
|
+
*
|
|
11
|
+
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
12
|
+
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
13
|
+
* for the specific language governing rights and limitations under the
|
|
14
|
+
* License.
|
|
15
|
+
*
|
|
16
|
+
* The Original Code is Mozilla Communicator client code, released
|
|
17
|
+
* March 31, 1998.
|
|
18
|
+
*
|
|
19
|
+
* The Initial Developer of the Original Code is
|
|
20
|
+
* Netscape Communications Corporation.
|
|
21
|
+
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
22
|
+
* the Initial Developer. All Rights Reserved.
|
|
23
|
+
*
|
|
24
|
+
* Contributor(s):
|
|
25
|
+
*
|
|
26
|
+
* Alternatively, the contents of this file may be used under the terms of
|
|
27
|
+
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
|
28
|
+
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
29
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
30
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
31
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
32
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
33
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
34
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
35
|
+
* the provisions above, a recipient may use your version of this file under
|
|
36
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
37
|
+
*
|
|
38
|
+
* This Original Code has been modified by IBM Corporation. Modifications made
|
|
39
|
+
* by IBM described herein are Copyright (c) International Business Machines
|
|
40
|
+
* Corporation, 2000.
|
|
41
|
+
* Modifications to Mozilla code or documentation identified per MPL Section 3.3
|
|
42
|
+
*
|
|
43
|
+
* Date Modified by Description of modification
|
|
44
|
+
* 04/20/2000 IBM Corp. OS/2 VisualAge build.
|
|
45
|
+
*
|
|
46
|
+
* ***** END LICENSE BLOCK ***** */
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* This file is part of the Java-vendor-neutral implementation of LiveConnect
|
|
50
|
+
*
|
|
51
|
+
* It contains the native code implementation of JS's JavaObject class.
|
|
52
|
+
*
|
|
53
|
+
* An instance of JavaObject is the JavaScript reflection of a Java object.
|
|
54
|
+
*
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
#include <stdlib.h>
|
|
58
|
+
#include <string.h>
|
|
59
|
+
|
|
60
|
+
#include "jsobj.h"
|
|
61
|
+
#include "jsj_private.h" /* LiveConnect internals */
|
|
62
|
+
#include "jsj_hash.h" /* Hash table with Java object as key */
|
|
63
|
+
|
|
64
|
+
#ifdef JSJ_THREADSAFE
|
|
65
|
+
#include "prmon.h"
|
|
66
|
+
#endif
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* This is a hash table that maps from Java objects to JS objects.
|
|
70
|
+
* It is used to ensure that the same JS object is obtained when a Java
|
|
71
|
+
* object is reflected more than once, so that JS object equality tests
|
|
72
|
+
* work in the expected manner, i.e. the "==" and "===" operators.
|
|
73
|
+
*
|
|
74
|
+
* The table entry keys are Java objects (of type jobject) and the entry values
|
|
75
|
+
* are JSObject pointers. Because the jobject type is an opaque handle and
|
|
76
|
+
* not necessarily a pointer, the hashing and key comparison functions must
|
|
77
|
+
* invoke the appropriate JVM functions.
|
|
78
|
+
*
|
|
79
|
+
* When the corresponding JS object instance is finalized, the entry is
|
|
80
|
+
* removed from the table, and a Java GC root for the Java object is removed.
|
|
81
|
+
*/
|
|
82
|
+
static JSJHashTable *java_obj_reflections = NULL;
|
|
83
|
+
|
|
84
|
+
#ifdef JSJ_THREADSAFE
|
|
85
|
+
static PRMonitor *java_obj_reflections_monitor = NULL;
|
|
86
|
+
static int java_obj_reflections_mutation_count = 0;
|
|
87
|
+
#endif
|
|
88
|
+
|
|
89
|
+
static JSBool installed_GC_callback = JS_FALSE;
|
|
90
|
+
static JSGCCallback old_GC_callback = NULL;
|
|
91
|
+
static JavaObjectWrapper* deferred_wrappers = NULL;
|
|
92
|
+
|
|
93
|
+
static JSBool JS_DLL_CALLBACK jsj_GC_callback(JSContext *cx, JSGCStatus status)
|
|
94
|
+
{
|
|
95
|
+
if (status == JSGC_END && deferred_wrappers) {
|
|
96
|
+
JNIEnv *jEnv;
|
|
97
|
+
JSJavaThreadState *jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
98
|
+
if (jEnv) {
|
|
99
|
+
JavaObjectWrapper* java_wrapper = deferred_wrappers;
|
|
100
|
+
while (java_wrapper) {
|
|
101
|
+
deferred_wrappers = java_wrapper->u.next;
|
|
102
|
+
(*jEnv)->DeleteGlobalRef(jEnv, java_wrapper->java_obj);
|
|
103
|
+
jsj_ReleaseJavaClassDescriptor(cx, jEnv, java_wrapper->class_descriptor);
|
|
104
|
+
JS_free(cx, java_wrapper);
|
|
105
|
+
java_wrapper = deferred_wrappers;
|
|
106
|
+
}
|
|
107
|
+
jsj_ExitJava(jsj_env);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/* always chain to old GC callback if non-null. */
|
|
111
|
+
return old_GC_callback ? old_GC_callback(cx, status) : JS_TRUE;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
JSBool
|
|
115
|
+
jsj_InitJavaObjReflectionsTable(void)
|
|
116
|
+
{
|
|
117
|
+
JS_ASSERT(!java_obj_reflections);
|
|
118
|
+
|
|
119
|
+
java_obj_reflections =
|
|
120
|
+
JSJ_NewHashTable(512, jsj_HashJavaObject, jsj_JavaObjectComparator,
|
|
121
|
+
NULL, NULL, NULL);
|
|
122
|
+
if (!java_obj_reflections)
|
|
123
|
+
return JS_FALSE;
|
|
124
|
+
|
|
125
|
+
#ifdef JSJ_THREADSAFE
|
|
126
|
+
java_obj_reflections_monitor = (struct PRMonitor *) PR_NewMonitor();
|
|
127
|
+
if (!java_obj_reflections_monitor) {
|
|
128
|
+
JSJ_HashTableDestroy(java_obj_reflections);
|
|
129
|
+
return JS_FALSE;
|
|
130
|
+
}
|
|
131
|
+
#endif
|
|
132
|
+
|
|
133
|
+
return JS_TRUE;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
JSObject *
|
|
137
|
+
jsj_WrapJavaObject(JSContext *cx,
|
|
138
|
+
JNIEnv *jEnv,
|
|
139
|
+
jobject java_obj,
|
|
140
|
+
jclass java_class)
|
|
141
|
+
{
|
|
142
|
+
JSJHashNumber hash_code;
|
|
143
|
+
JSClass *js_class;
|
|
144
|
+
JSObject *js_wrapper_obj;
|
|
145
|
+
JavaObjectWrapper *java_wrapper;
|
|
146
|
+
JavaClassDescriptor *class_descriptor;
|
|
147
|
+
JSJHashEntry *he, **hep;
|
|
148
|
+
|
|
149
|
+
#ifdef JSJ_THREADSAFE
|
|
150
|
+
int mutation_count;
|
|
151
|
+
#endif
|
|
152
|
+
|
|
153
|
+
js_wrapper_obj = NULL;
|
|
154
|
+
|
|
155
|
+
hash_code = jsj_HashJavaObject((void*)java_obj, (void*)jEnv);
|
|
156
|
+
|
|
157
|
+
#ifdef JSJ_THREADSAFE
|
|
158
|
+
PR_EnterMonitor(java_obj_reflections_monitor);
|
|
159
|
+
#endif
|
|
160
|
+
|
|
161
|
+
if (!installed_GC_callback) {
|
|
162
|
+
/*
|
|
163
|
+
* Hook into GC callback mechanism, so we can defer deleting global
|
|
164
|
+
* references until it's safe.
|
|
165
|
+
*/
|
|
166
|
+
old_GC_callback = JS_SetGCCallback(cx, jsj_GC_callback);
|
|
167
|
+
installed_GC_callback = JS_TRUE;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
hep = JSJ_HashTableRawLookup(java_obj_reflections,
|
|
171
|
+
hash_code, java_obj, (void*)jEnv);
|
|
172
|
+
he = *hep;
|
|
173
|
+
|
|
174
|
+
#ifdef JSJ_THREADSAFE
|
|
175
|
+
/* Track mutations to hash table */
|
|
176
|
+
mutation_count = java_obj_reflections_mutation_count;
|
|
177
|
+
|
|
178
|
+
/* We must temporarily release this monitor so as to avoid
|
|
179
|
+
deadlocks with the JS GC. See Bugsplat #354852 */
|
|
180
|
+
PR_ExitMonitor(java_obj_reflections_monitor);
|
|
181
|
+
#endif
|
|
182
|
+
|
|
183
|
+
if (he) {
|
|
184
|
+
js_wrapper_obj = (JSObject *)he->value;
|
|
185
|
+
if (js_wrapper_obj)
|
|
186
|
+
return js_wrapper_obj;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* No existing reflection found. Construct a new one */
|
|
190
|
+
class_descriptor = jsj_GetJavaClassDescriptor(cx, jEnv, java_class);
|
|
191
|
+
if (!class_descriptor)
|
|
192
|
+
return NULL;
|
|
193
|
+
if (class_descriptor->type == JAVA_SIGNATURE_ARRAY) {
|
|
194
|
+
js_class = &JavaArray_class;
|
|
195
|
+
} else {
|
|
196
|
+
JS_ASSERT(IS_OBJECT_TYPE(class_descriptor->type));
|
|
197
|
+
js_class = &JavaObject_class;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Create new JS object to reflect Java object */
|
|
201
|
+
js_wrapper_obj = JS_NewObject(cx, js_class, NULL, NULL);
|
|
202
|
+
if (!js_wrapper_obj)
|
|
203
|
+
return NULL;
|
|
204
|
+
|
|
205
|
+
/* Create private, native portion of JavaObject */
|
|
206
|
+
java_wrapper =
|
|
207
|
+
(JavaObjectWrapper *)JS_malloc(cx, sizeof(JavaObjectWrapper));
|
|
208
|
+
if (!java_wrapper) {
|
|
209
|
+
jsj_ReleaseJavaClassDescriptor(cx, jEnv, class_descriptor);
|
|
210
|
+
return NULL;
|
|
211
|
+
}
|
|
212
|
+
JS_SetPrivate(cx, js_wrapper_obj, java_wrapper);
|
|
213
|
+
java_wrapper->class_descriptor = class_descriptor;
|
|
214
|
+
java_wrapper->java_obj = NULL;
|
|
215
|
+
|
|
216
|
+
#ifdef JSJ_THREADSAFE
|
|
217
|
+
PR_EnterMonitor(java_obj_reflections_monitor);
|
|
218
|
+
|
|
219
|
+
/* We may need to do the hash table lookup again, since some other
|
|
220
|
+
thread may have updated it while the lock wasn't being held. */
|
|
221
|
+
if (mutation_count != java_obj_reflections_mutation_count) {
|
|
222
|
+
hep = JSJ_HashTableRawLookup(java_obj_reflections,
|
|
223
|
+
hash_code, java_obj, (void*)jEnv);
|
|
224
|
+
he = *hep;
|
|
225
|
+
if (he) {
|
|
226
|
+
js_wrapper_obj = (JSObject *)he->value;
|
|
227
|
+
if (js_wrapper_obj) {
|
|
228
|
+
PR_ExitMonitor(java_obj_reflections_monitor);
|
|
229
|
+
return js_wrapper_obj;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
java_obj_reflections_mutation_count++;
|
|
235
|
+
|
|
236
|
+
#endif
|
|
237
|
+
|
|
238
|
+
java_obj = (*jEnv)->NewGlobalRef(jEnv, java_obj);
|
|
239
|
+
java_wrapper->java_obj = java_obj;
|
|
240
|
+
if (!java_obj)
|
|
241
|
+
goto out_of_memory;
|
|
242
|
+
|
|
243
|
+
/* cache the hash code for all time. */
|
|
244
|
+
java_wrapper->u.hash_code = hash_code;
|
|
245
|
+
|
|
246
|
+
/* Add the JavaObject to the hash table */
|
|
247
|
+
he = JSJ_HashTableRawAdd(java_obj_reflections, hep, hash_code,
|
|
248
|
+
java_obj, js_wrapper_obj, (void*)jEnv);
|
|
249
|
+
#ifdef JSJ_THREADSAFE
|
|
250
|
+
PR_ExitMonitor(java_obj_reflections_monitor);
|
|
251
|
+
#endif
|
|
252
|
+
|
|
253
|
+
if (!he) {
|
|
254
|
+
(*jEnv)->DeleteGlobalRef(jEnv, java_obj);
|
|
255
|
+
goto out_of_memory;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return js_wrapper_obj;
|
|
259
|
+
|
|
260
|
+
out_of_memory:
|
|
261
|
+
/* No need to free js_wrapper_obj, as it will be finalized by GC. */
|
|
262
|
+
JS_ReportOutOfMemory(cx);
|
|
263
|
+
return NULL;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
static void
|
|
267
|
+
remove_java_obj_reflection_from_hashtable(jobject java_obj, JSJHashNumber hash_code)
|
|
268
|
+
{
|
|
269
|
+
JSJHashEntry *he, **hep;
|
|
270
|
+
|
|
271
|
+
#ifdef JSJ_THREADSAFE
|
|
272
|
+
PR_EnterMonitor(java_obj_reflections_monitor);
|
|
273
|
+
#endif
|
|
274
|
+
|
|
275
|
+
hep = JSJ_HashTableRawLookup(java_obj_reflections, hash_code,
|
|
276
|
+
java_obj, NULL);
|
|
277
|
+
he = *hep;
|
|
278
|
+
|
|
279
|
+
JS_ASSERT(he);
|
|
280
|
+
if (he)
|
|
281
|
+
JSJ_HashTableRawRemove(java_obj_reflections, hep, he, NULL);
|
|
282
|
+
|
|
283
|
+
#ifdef JSJ_THREADSAFE
|
|
284
|
+
java_obj_reflections_mutation_count++;
|
|
285
|
+
|
|
286
|
+
PR_ExitMonitor(java_obj_reflections_monitor);
|
|
287
|
+
#endif
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
JS_EXPORT_API(void)
|
|
291
|
+
JavaObject_finalize(JSContext *cx, JSObject *obj)
|
|
292
|
+
{
|
|
293
|
+
JavaObjectWrapper *java_wrapper;
|
|
294
|
+
jobject java_obj;
|
|
295
|
+
JNIEnv *jEnv;
|
|
296
|
+
JSJavaThreadState *jsj_env;
|
|
297
|
+
|
|
298
|
+
java_wrapper = JS_GetPrivate(cx, obj);
|
|
299
|
+
if (!java_wrapper)
|
|
300
|
+
return;
|
|
301
|
+
java_obj = java_wrapper->java_obj;
|
|
302
|
+
|
|
303
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
304
|
+
if (!jEnv)
|
|
305
|
+
return;
|
|
306
|
+
|
|
307
|
+
if (java_obj) {
|
|
308
|
+
remove_java_obj_reflection_from_hashtable(java_obj, java_wrapper->u.hash_code);
|
|
309
|
+
|
|
310
|
+
/* defer releasing global refs until it is safe to do so. */
|
|
311
|
+
java_wrapper->u.next = deferred_wrappers;
|
|
312
|
+
deferred_wrappers = java_wrapper;
|
|
313
|
+
} else {
|
|
314
|
+
jsj_ReleaseJavaClassDescriptor(cx, jEnv, java_wrapper->class_descriptor);
|
|
315
|
+
JS_free(cx, java_wrapper);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
jsj_ExitJava(jsj_env);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/* Trivial helper for jsj_DiscardJavaObjReflections(), below */
|
|
322
|
+
static JSIntn
|
|
323
|
+
enumerate_remove_java_obj(JSJHashEntry *he, JSIntn i, void *arg)
|
|
324
|
+
{
|
|
325
|
+
JSJavaThreadState *jsj_env = (JSJavaThreadState *)arg;
|
|
326
|
+
JNIEnv *jEnv = jsj_env->jEnv;
|
|
327
|
+
jobject java_obj;
|
|
328
|
+
JavaObjectWrapper *java_wrapper;
|
|
329
|
+
JSObject *java_wrapper_obj;
|
|
330
|
+
|
|
331
|
+
java_wrapper_obj = (JSObject *)he->value;
|
|
332
|
+
|
|
333
|
+
/* Warning: NULL argument may cause assertion in JS engine, but it's actually OK */
|
|
334
|
+
java_wrapper = JS_GetPrivate(jsj_env->cx, java_wrapper_obj);
|
|
335
|
+
java_obj = java_wrapper->java_obj;
|
|
336
|
+
(*jEnv)->DeleteGlobalRef(jEnv, java_obj);
|
|
337
|
+
java_wrapper->java_obj = NULL;
|
|
338
|
+
return HT_ENUMERATE_REMOVE;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/* This shutdown routine discards all JNI references to Java objects
|
|
342
|
+
that have been reflected into JS, even if there are still references
|
|
343
|
+
to them from JS. */
|
|
344
|
+
void
|
|
345
|
+
jsj_DiscardJavaObjReflections(JNIEnv *jEnv)
|
|
346
|
+
{
|
|
347
|
+
JSJavaThreadState *jsj_env;
|
|
348
|
+
char *err_msg;
|
|
349
|
+
|
|
350
|
+
/* Get the per-thread state corresponding to the current Java thread */
|
|
351
|
+
jsj_env = jsj_MapJavaThreadToJSJavaThreadState(jEnv, &err_msg);
|
|
352
|
+
JS_ASSERT(jsj_env);
|
|
353
|
+
if (!jsj_env)
|
|
354
|
+
return;
|
|
355
|
+
|
|
356
|
+
if (java_obj_reflections) {
|
|
357
|
+
JSJ_HashTableEnumerateEntries(java_obj_reflections,
|
|
358
|
+
enumerate_remove_java_obj,
|
|
359
|
+
(void*)jsj_env);
|
|
360
|
+
JSJ_HashTableDestroy(java_obj_reflections);
|
|
361
|
+
java_obj_reflections = NULL;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
JSBool JS_DLL_CALLBACK
|
|
366
|
+
JavaObject_convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
|
|
367
|
+
{
|
|
368
|
+
JavaObjectWrapper *java_wrapper;
|
|
369
|
+
JavaClassDescriptor *class_descriptor;
|
|
370
|
+
jobject java_obj;
|
|
371
|
+
JNIEnv *jEnv;
|
|
372
|
+
JSJavaThreadState *jsj_env;
|
|
373
|
+
JSBool result;
|
|
374
|
+
|
|
375
|
+
java_wrapper = JS_GetPrivate(cx, obj);
|
|
376
|
+
if (!java_wrapper) {
|
|
377
|
+
if (type == JSTYPE_OBJECT) {
|
|
378
|
+
*vp = OBJECT_TO_JSVAL(obj);
|
|
379
|
+
return JS_TRUE;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
383
|
+
JSJMSG_BAD_OP_JOBJECT);
|
|
384
|
+
return JS_FALSE;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
java_obj = java_wrapper->java_obj;
|
|
388
|
+
class_descriptor = java_wrapper->class_descriptor;
|
|
389
|
+
|
|
390
|
+
switch (type) {
|
|
391
|
+
case JSTYPE_OBJECT:
|
|
392
|
+
*vp = OBJECT_TO_JSVAL(obj);
|
|
393
|
+
return JS_TRUE;
|
|
394
|
+
|
|
395
|
+
case JSTYPE_FUNCTION:
|
|
396
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
397
|
+
JSJMSG_CONVERT_TO_FUNC);
|
|
398
|
+
return JS_FALSE;
|
|
399
|
+
|
|
400
|
+
case JSTYPE_VOID:
|
|
401
|
+
case JSTYPE_STRING:
|
|
402
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
403
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
404
|
+
if (!jEnv)
|
|
405
|
+
return JS_FALSE;
|
|
406
|
+
|
|
407
|
+
/* Either extract a C-string from the java.lang.String object
|
|
408
|
+
or call the Java toString() method */
|
|
409
|
+
result = jsj_ConvertJavaObjectToJSString(cx, jEnv, class_descriptor, java_obj, vp);
|
|
410
|
+
jsj_ExitJava(jsj_env);
|
|
411
|
+
return result;
|
|
412
|
+
|
|
413
|
+
case JSTYPE_NUMBER:
|
|
414
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
415
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
416
|
+
if (!jEnv)
|
|
417
|
+
return JS_FALSE;
|
|
418
|
+
|
|
419
|
+
/* Call Java doubleValue() method, if applicable */
|
|
420
|
+
result = jsj_ConvertJavaObjectToJSNumber(cx, jEnv, class_descriptor, java_obj, vp);
|
|
421
|
+
jsj_ExitJava(jsj_env);
|
|
422
|
+
return result;
|
|
423
|
+
|
|
424
|
+
case JSTYPE_BOOLEAN:
|
|
425
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
426
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
427
|
+
if (!jEnv)
|
|
428
|
+
return JS_FALSE;
|
|
429
|
+
|
|
430
|
+
/* Call booleanValue() method, if applicable */
|
|
431
|
+
result = jsj_ConvertJavaObjectToJSBoolean(cx, jEnv, class_descriptor, java_obj, vp);
|
|
432
|
+
jsj_ExitJava(jsj_env);
|
|
433
|
+
return result;
|
|
434
|
+
|
|
435
|
+
default:
|
|
436
|
+
JS_ASSERT(0);
|
|
437
|
+
return JS_FALSE;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/*
|
|
442
|
+
* Get a property from the prototype object of a native ECMA object, i.e.
|
|
443
|
+
* return <js_constructor_name>.prototype.<member_name>
|
|
444
|
+
* This is used to allow Java objects to inherit methods from Array.prototype
|
|
445
|
+
* and String.prototype.
|
|
446
|
+
*/
|
|
447
|
+
static JSBool
|
|
448
|
+
inherit_props_from_JS_natives(JSContext *cx, const char *js_constructor_name,
|
|
449
|
+
const char *member_name, jsval *vp)
|
|
450
|
+
{
|
|
451
|
+
JSObject *global_obj, *constructor_obj, *prototype_obj;
|
|
452
|
+
jsval constructor_val, prototype_val;
|
|
453
|
+
|
|
454
|
+
global_obj = JS_GetGlobalObject(cx);
|
|
455
|
+
JS_ASSERT(global_obj);
|
|
456
|
+
if (!global_obj)
|
|
457
|
+
return JS_FALSE;
|
|
458
|
+
|
|
459
|
+
JS_GetProperty(cx, global_obj, js_constructor_name, &constructor_val);
|
|
460
|
+
JS_ASSERT(JSVAL_IS_OBJECT(constructor_val));
|
|
461
|
+
constructor_obj = JSVAL_TO_OBJECT(constructor_val);
|
|
462
|
+
|
|
463
|
+
JS_GetProperty(cx, constructor_obj, "prototype", &prototype_val);
|
|
464
|
+
JS_ASSERT(JSVAL_IS_OBJECT(prototype_val));
|
|
465
|
+
prototype_obj = JSVAL_TO_OBJECT(prototype_val);
|
|
466
|
+
|
|
467
|
+
return JS_GetProperty(cx, prototype_obj, member_name, vp) && *vp != JSVAL_VOID;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
struct JSJPropertyInfo {
|
|
471
|
+
JSBool wantProp; /* input param tells whether prop is returned */
|
|
472
|
+
const char* name; /* output param, name of property (XXX ASCII) */
|
|
473
|
+
uintN attributes; /* output param, attributes of property */
|
|
474
|
+
JSProperty *prop; /* output param, if wantProp, held pointer that
|
|
475
|
+
must be released via OBJ_DROP_PROPERTY */
|
|
476
|
+
};
|
|
477
|
+
typedef struct JSJPropertyInfo JSJPropertyInfo;
|
|
478
|
+
|
|
479
|
+
static JSBool
|
|
480
|
+
lookup_member_by_id(JSContext *cx, JNIEnv *jEnv, JSObject *obj,
|
|
481
|
+
JavaObjectWrapper **java_wrapperp, jsid id,
|
|
482
|
+
JavaMemberDescriptor **member_descriptorp,
|
|
483
|
+
jsval *vp, JSObject **proto_chainp,
|
|
484
|
+
JSJPropertyInfo *prop_infop)
|
|
485
|
+
{
|
|
486
|
+
jsval idval;
|
|
487
|
+
JavaObjectWrapper *java_wrapper;
|
|
488
|
+
JavaMemberDescriptor *member_descriptor;
|
|
489
|
+
const char *member_name;
|
|
490
|
+
JavaClassDescriptor *class_descriptor;
|
|
491
|
+
JSObject *proto_chain;
|
|
492
|
+
JSBool found_in_proto;
|
|
493
|
+
|
|
494
|
+
found_in_proto = JS_FALSE;
|
|
495
|
+
member_descriptor = NULL;
|
|
496
|
+
java_wrapper = JS_GetPrivate(cx, obj);
|
|
497
|
+
|
|
498
|
+
/* Handle accesses to prototype object */
|
|
499
|
+
if (!java_wrapper) {
|
|
500
|
+
if (JS_IdToValue(cx, id, &idval) && JSVAL_IS_STRING(idval) &&
|
|
501
|
+
(member_name = JS_GetStringBytes(JSVAL_TO_STRING(idval))) != NULL) {
|
|
502
|
+
if (!strcmp(member_name, "constructor"))
|
|
503
|
+
goto done;
|
|
504
|
+
}
|
|
505
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_BAD_OP_JOBJECT);
|
|
506
|
+
return JS_FALSE;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
class_descriptor = java_wrapper->class_descriptor;
|
|
510
|
+
JS_ASSERT(IS_REFERENCE_TYPE(class_descriptor->type));
|
|
511
|
+
|
|
512
|
+
member_descriptor = jsj_LookupJavaMemberDescriptorById(cx, jEnv, class_descriptor, id);
|
|
513
|
+
if (member_descriptor)
|
|
514
|
+
goto done;
|
|
515
|
+
|
|
516
|
+
/* Instances can reference static methods and fields */
|
|
517
|
+
member_descriptor = jsj_LookupJavaStaticMemberDescriptorById(cx, jEnv, class_descriptor, id);
|
|
518
|
+
if (member_descriptor)
|
|
519
|
+
goto done;
|
|
520
|
+
|
|
521
|
+
/* Ensure that the property we're searching for is string-valued. */
|
|
522
|
+
JS_IdToValue(cx, id, &idval);
|
|
523
|
+
if (!JSVAL_IS_STRING(idval)) {
|
|
524
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_BAD_JOBJECT_EXPR);
|
|
525
|
+
return JS_FALSE;
|
|
526
|
+
}
|
|
527
|
+
member_name = JS_GetStringBytes(JSVAL_TO_STRING(idval));
|
|
528
|
+
|
|
529
|
+
/*
|
|
530
|
+
* A little LC3 feature magic:
|
|
531
|
+
* + Instances of java.lang.String "inherit" the standard ECMA string methods
|
|
532
|
+
* of String.prototype. All of the ECMA string methods convert the Java
|
|
533
|
+
* string to a JS string before performing the string operation. For example,
|
|
534
|
+
* s = new java.lang.String("foobar");
|
|
535
|
+
* return s.slice(2);
|
|
536
|
+
* + Similarly, instances of Java arrays "inherit" the standard ECMA array
|
|
537
|
+
* methods of Array.prototype. (Not all of these methods work properly
|
|
538
|
+
* on JavaArray objects, however, since the 'length' property is read-only.)
|
|
539
|
+
*/
|
|
540
|
+
if (vp) {
|
|
541
|
+
if ((class_descriptor->type == JAVA_SIGNATURE_JAVA_LANG_STRING) &&
|
|
542
|
+
inherit_props_from_JS_natives(cx, "String", member_name, vp))
|
|
543
|
+
goto done;
|
|
544
|
+
if ((class_descriptor->type == JAVA_SIGNATURE_ARRAY) &&
|
|
545
|
+
inherit_props_from_JS_natives(cx, "Array", member_name, vp))
|
|
546
|
+
goto done;
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
/* Check for access to magic prototype chain property */
|
|
550
|
+
if (!strcmp(member_name, "__proto__")) {
|
|
551
|
+
proto_chain = JS_GetPrototype(cx, obj);
|
|
552
|
+
if (vp)
|
|
553
|
+
*vp = OBJECT_TO_JSVAL(proto_chain);
|
|
554
|
+
goto done;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/*
|
|
558
|
+
* See if the property looks like the explicit resolution of an
|
|
559
|
+
* overloaded method, e.g. "max(double,double)", first as an instance method,
|
|
560
|
+
* then as a static method. If we find such a method, it will be cached
|
|
561
|
+
* so future accesses won't run this code.
|
|
562
|
+
*/
|
|
563
|
+
member_descriptor = jsj_ResolveExplicitMethod(cx, jEnv, class_descriptor, id, JS_FALSE);
|
|
564
|
+
if (member_descriptor)
|
|
565
|
+
goto done;
|
|
566
|
+
member_descriptor = jsj_ResolveExplicitMethod(cx, jEnv, class_descriptor, id, JS_TRUE);
|
|
567
|
+
if (member_descriptor)
|
|
568
|
+
goto done;
|
|
569
|
+
|
|
570
|
+
/* Is the property defined in the prototype chain? */
|
|
571
|
+
if (proto_chainp && prop_infop) {
|
|
572
|
+
/* If so, follow __proto__ link to search prototype chain */
|
|
573
|
+
proto_chain = JS_GetPrototype(cx, obj);
|
|
574
|
+
|
|
575
|
+
/* Use OBJ_LOOKUP_PROPERTY to determine if and where the property
|
|
576
|
+
actually exists in the prototype chain. */
|
|
577
|
+
if (proto_chain) {
|
|
578
|
+
if (!OBJ_LOOKUP_PROPERTY(cx, proto_chain, id, proto_chainp,
|
|
579
|
+
&prop_infop->prop)) {
|
|
580
|
+
return JS_FALSE;
|
|
581
|
+
}
|
|
582
|
+
if (prop_infop->prop) {
|
|
583
|
+
if (!OBJ_GET_ATTRIBUTES(cx, *proto_chainp, id, prop_infop->prop,
|
|
584
|
+
&prop_infop->attributes)) {
|
|
585
|
+
OBJ_DROP_PROPERTY(cx, *proto_chainp, prop_infop->prop);
|
|
586
|
+
return JS_FALSE;
|
|
587
|
+
}
|
|
588
|
+
if (!prop_infop->wantProp) {
|
|
589
|
+
OBJ_DROP_PROPERTY(cx, *proto_chainp, prop_infop->prop);
|
|
590
|
+
prop_infop->prop = NULL;
|
|
591
|
+
}
|
|
592
|
+
prop_infop->name = member_name;
|
|
593
|
+
found_in_proto = JS_TRUE;
|
|
594
|
+
goto done;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/* Report lack of Java member with the given property name */
|
|
600
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL, JSJMSG_NO_INSTANCE_NAME,
|
|
601
|
+
class_descriptor->name, member_name);
|
|
602
|
+
return JS_FALSE;
|
|
603
|
+
|
|
604
|
+
done:
|
|
605
|
+
/* Success. Handle the multiple return values */
|
|
606
|
+
if (java_wrapperp)
|
|
607
|
+
*java_wrapperp = java_wrapper;
|
|
608
|
+
if (member_descriptorp)
|
|
609
|
+
*member_descriptorp = member_descriptor;
|
|
610
|
+
if (proto_chainp && !found_in_proto)
|
|
611
|
+
*proto_chainp = NULL;
|
|
612
|
+
return JS_TRUE;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
JS_EXPORT_API(JSBool)
|
|
616
|
+
JavaObject_getPropertyById(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
|
|
617
|
+
{
|
|
618
|
+
jobject java_obj;
|
|
619
|
+
JavaMemberDescriptor *member_descriptor;
|
|
620
|
+
JavaObjectWrapper *java_wrapper;
|
|
621
|
+
JNIEnv *jEnv;
|
|
622
|
+
JSObject *funobj;
|
|
623
|
+
jsval field_val, method_val;
|
|
624
|
+
JSBool success;
|
|
625
|
+
JSJavaThreadState *jsj_env;
|
|
626
|
+
JSObject *proto_chain;
|
|
627
|
+
JSJPropertyInfo prop_info;
|
|
628
|
+
|
|
629
|
+
/* printf("In JavaObject_getProperty\n"); */
|
|
630
|
+
|
|
631
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
632
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
633
|
+
if (!jEnv)
|
|
634
|
+
return JS_FALSE;
|
|
635
|
+
|
|
636
|
+
if (vp)
|
|
637
|
+
*vp = JSVAL_VOID;
|
|
638
|
+
prop_info.wantProp = JS_FALSE;
|
|
639
|
+
if (!lookup_member_by_id(cx, jEnv, obj, &java_wrapper, id, &member_descriptor, vp,
|
|
640
|
+
&proto_chain, &prop_info)) {
|
|
641
|
+
jsj_ExitJava(jsj_env);
|
|
642
|
+
return JS_FALSE;
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/* Handle access to special, non-Java properties of JavaObjects, e.g. the
|
|
646
|
+
"constructor" property of the prototype object */
|
|
647
|
+
if (!member_descriptor) {
|
|
648
|
+
jsj_ExitJava(jsj_env);
|
|
649
|
+
if (proto_chain)
|
|
650
|
+
return JS_GetProperty(cx, proto_chain, prop_info.name, vp);
|
|
651
|
+
return JS_TRUE;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
java_obj = java_wrapper->java_obj;
|
|
655
|
+
field_val = method_val = JSVAL_VOID;
|
|
656
|
+
|
|
657
|
+
if (jaApplet && (*jEnv)->IsInstanceOf(jEnv, java_obj, jaApplet)) {
|
|
658
|
+
jsj_JSIsCallingApplet = JS_TRUE;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
/* If a field member, get the value of the field */
|
|
662
|
+
if (member_descriptor->field) {
|
|
663
|
+
success = jsj_GetJavaFieldValue(cx, jEnv, member_descriptor->field, java_obj, &field_val);
|
|
664
|
+
if (!success) {
|
|
665
|
+
jsj_ExitJava(jsj_env);
|
|
666
|
+
return JS_FALSE;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/* If a method member, build a wrapper around the Java method */
|
|
671
|
+
if (member_descriptor->methods) {
|
|
672
|
+
/* Create a function object with this JavaObject as its parent, so that
|
|
673
|
+
JSFUN_BOUND_METHOD binds it as the default 'this' for the function. */
|
|
674
|
+
funobj = JS_CloneFunctionObject(cx, member_descriptor->invoke_func_obj, obj);
|
|
675
|
+
if (!funobj) {
|
|
676
|
+
jsj_ExitJava(jsj_env);
|
|
677
|
+
return JS_FALSE;
|
|
678
|
+
}
|
|
679
|
+
method_val = OBJECT_TO_JSVAL(funobj);
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
#if TEST_JAVAMEMBER
|
|
683
|
+
/* Always create a JavaMember object, even though it's inefficient */
|
|
684
|
+
obj = jsj_CreateJavaMember(cx, method_val, field_val);
|
|
685
|
+
if (!obj) {
|
|
686
|
+
jsj_ExitJava(jsj_env);
|
|
687
|
+
return JS_FALSE;
|
|
688
|
+
}
|
|
689
|
+
*vp = OBJECT_TO_JSVAL(obj);
|
|
690
|
+
#else /* !TEST_JAVAMEMBER */
|
|
691
|
+
|
|
692
|
+
if (member_descriptor->field) {
|
|
693
|
+
if (!member_descriptor->methods) {
|
|
694
|
+
/* Return value of Java field */
|
|
695
|
+
*vp = field_val;
|
|
696
|
+
} else {
|
|
697
|
+
/* Handle special case of access to a property that could refer
|
|
698
|
+
to either a Java field or a method that share the same name.
|
|
699
|
+
In Java, such ambiguity is not possible because the compiler
|
|
700
|
+
can statically determine which is being accessed. */
|
|
701
|
+
obj = jsj_CreateJavaMember(cx, method_val, field_val);
|
|
702
|
+
if (!obj) {
|
|
703
|
+
jsj_ExitJava(jsj_env);
|
|
704
|
+
return JS_FALSE;
|
|
705
|
+
}
|
|
706
|
+
*vp = OBJECT_TO_JSVAL(obj);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
} else {
|
|
710
|
+
/* Return wrapper around Java method */
|
|
711
|
+
*vp = method_val;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
#endif /* !TEST_JAVAMEMBER */
|
|
715
|
+
|
|
716
|
+
jsj_ExitJava(jsj_env);
|
|
717
|
+
return JS_TRUE;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
721
|
+
JavaObject_setPropertyById(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
|
|
722
|
+
{
|
|
723
|
+
jobject java_obj;
|
|
724
|
+
const char *member_name;
|
|
725
|
+
JavaObjectWrapper *java_wrapper;
|
|
726
|
+
JavaClassDescriptor *class_descriptor;
|
|
727
|
+
JavaMemberDescriptor *member_descriptor;
|
|
728
|
+
jsval idval;
|
|
729
|
+
JNIEnv *jEnv;
|
|
730
|
+
JSJavaThreadState *jsj_env;
|
|
731
|
+
JSObject *proto_chain;
|
|
732
|
+
JSJPropertyInfo prop_info;
|
|
733
|
+
JSBool result;
|
|
734
|
+
|
|
735
|
+
/* printf("In JavaObject_setProperty\n"); */
|
|
736
|
+
|
|
737
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
738
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
739
|
+
if (!jEnv)
|
|
740
|
+
return JS_FALSE;
|
|
741
|
+
|
|
742
|
+
prop_info.wantProp = JS_FALSE;
|
|
743
|
+
if (!lookup_member_by_id(cx, jEnv, obj, &java_wrapper, id, &member_descriptor, NULL,
|
|
744
|
+
&proto_chain, &prop_info)) {
|
|
745
|
+
jsj_ExitJava(jsj_env);
|
|
746
|
+
return JS_FALSE;
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/* Could be assignment to magic JS __proto__ property rather than a Java field */
|
|
750
|
+
if (!member_descriptor) {
|
|
751
|
+
if (proto_chain && (prop_info.attributes & JSPROP_SHARED)) {
|
|
752
|
+
JS_SetProperty(cx, proto_chain, prop_info.name, vp);
|
|
753
|
+
} else {
|
|
754
|
+
JS_IdToValue(cx, id, &idval);
|
|
755
|
+
if (!JSVAL_IS_STRING(idval))
|
|
756
|
+
goto no_such_field;
|
|
757
|
+
member_name = JS_GetStringBytes(JSVAL_TO_STRING(idval));
|
|
758
|
+
if (strcmp(member_name, "__proto__"))
|
|
759
|
+
goto no_such_field;
|
|
760
|
+
if (!JSVAL_IS_OBJECT(*vp)) {
|
|
761
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
762
|
+
JSJMSG_BAD_PROTO_ASSIGNMENT);
|
|
763
|
+
jsj_ExitJava(jsj_env);
|
|
764
|
+
return JS_FALSE;
|
|
765
|
+
}
|
|
766
|
+
JS_SetPrototype(cx, obj, JSVAL_TO_OBJECT(*vp));
|
|
767
|
+
}
|
|
768
|
+
jsj_ExitJava(jsj_env);
|
|
769
|
+
return JS_TRUE;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/* Check for the case where there is a method with the given name, but no field
|
|
773
|
+
with that name */
|
|
774
|
+
if (!member_descriptor->field)
|
|
775
|
+
goto no_such_field;
|
|
776
|
+
|
|
777
|
+
/* Silently fail if field value is final (immutable), as required by ECMA spec */
|
|
778
|
+
if (member_descriptor->field->modifiers & ACC_FINAL) {
|
|
779
|
+
jsj_ExitJava(jsj_env);
|
|
780
|
+
return JS_TRUE;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
java_obj = java_wrapper->java_obj;
|
|
784
|
+
|
|
785
|
+
if (jaApplet && (*jEnv)->IsInstanceOf(jEnv, java_obj, jaApplet)) {
|
|
786
|
+
jsj_JSIsCallingApplet = JS_TRUE;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
result = jsj_SetJavaFieldValue(cx, jEnv, member_descriptor->field, java_obj, *vp);
|
|
790
|
+
jsj_ExitJava(jsj_env);
|
|
791
|
+
return result;
|
|
792
|
+
|
|
793
|
+
no_such_field:
|
|
794
|
+
JS_IdToValue(cx, id, &idval);
|
|
795
|
+
member_name = JS_GetStringBytes(JSVAL_TO_STRING(idval));
|
|
796
|
+
class_descriptor = java_wrapper->class_descriptor;
|
|
797
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
798
|
+
JSJMSG_NO_NAME_IN_CLASS,
|
|
799
|
+
member_name, class_descriptor->name);
|
|
800
|
+
jsj_ExitJava(jsj_env);
|
|
801
|
+
return JS_FALSE;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
805
|
+
JavaObject_lookupProperty(JSContext *cx, JSObject *obj, jsid id,
|
|
806
|
+
JSObject **objp, JSProperty **propp
|
|
807
|
+
#if defined JS_THREADSAFE && defined DEBUG
|
|
808
|
+
, const char *file, uintN line
|
|
809
|
+
#endif
|
|
810
|
+
)
|
|
811
|
+
{
|
|
812
|
+
JNIEnv *jEnv;
|
|
813
|
+
JSErrorReporter old_reporter;
|
|
814
|
+
jsval dummy_val;
|
|
815
|
+
JSObject *proto_chain;
|
|
816
|
+
JSJPropertyInfo prop_info;
|
|
817
|
+
JSJavaThreadState *jsj_env;
|
|
818
|
+
|
|
819
|
+
/* printf("In JavaObject_lookupProperty()\n"); */
|
|
820
|
+
|
|
821
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
822
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
823
|
+
if (!jEnv)
|
|
824
|
+
return JS_FALSE;
|
|
825
|
+
|
|
826
|
+
old_reporter = JS_SetErrorReporter(cx, NULL);
|
|
827
|
+
prop_info.wantProp = JS_TRUE;
|
|
828
|
+
if (lookup_member_by_id(cx, jEnv, obj, NULL, id, NULL, &dummy_val,
|
|
829
|
+
&proto_chain, &prop_info)) {
|
|
830
|
+
/* signify that the property is in the prototype chain or the object itself. */
|
|
831
|
+
if (proto_chain) {
|
|
832
|
+
*objp = proto_chain;
|
|
833
|
+
*propp = prop_info.prop;
|
|
834
|
+
} else {
|
|
835
|
+
*objp = obj;
|
|
836
|
+
*propp = (JSProperty*)1;
|
|
837
|
+
}
|
|
838
|
+
} else {
|
|
839
|
+
*objp = NULL;
|
|
840
|
+
*propp = NULL;
|
|
841
|
+
}
|
|
842
|
+
|
|
843
|
+
JS_SetErrorReporter(cx, old_reporter);
|
|
844
|
+
jsj_ExitJava(jsj_env);
|
|
845
|
+
return JS_TRUE;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
849
|
+
JavaObject_defineProperty(JSContext *cx, JSObject *obj, jsid id, jsval value,
|
|
850
|
+
JSPropertyOp getter, JSPropertyOp setter,
|
|
851
|
+
uintN attrs, JSProperty **propp)
|
|
852
|
+
{
|
|
853
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
854
|
+
JSJMSG_JOBJECT_PROP_DEFINE);
|
|
855
|
+
return JS_FALSE;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
859
|
+
JavaObject_getAttributes(JSContext *cx, JSObject *obj, jsid id,
|
|
860
|
+
JSProperty *prop, uintN *attrsp)
|
|
861
|
+
{
|
|
862
|
+
/* We don't maintain JS property attributes for Java class members */
|
|
863
|
+
*attrsp = JSPROP_PERMANENT|JSPROP_ENUMERATE;
|
|
864
|
+
return JS_TRUE;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
868
|
+
JavaObject_setAttributes(JSContext *cx, JSObject *obj, jsid id,
|
|
869
|
+
JSProperty *prop, uintN *attrsp)
|
|
870
|
+
{
|
|
871
|
+
/* We don't maintain JS property attributes for Java class members */
|
|
872
|
+
if (*attrsp != (JSPROP_PERMANENT|JSPROP_ENUMERATE)) {
|
|
873
|
+
JS_ASSERT(0);
|
|
874
|
+
return JS_FALSE;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/* Silently ignore all setAttribute attempts */
|
|
878
|
+
return JS_TRUE;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
882
|
+
JavaObject_deleteProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
|
|
883
|
+
{
|
|
884
|
+
JSVersion version = JS_GetVersion(cx);
|
|
885
|
+
|
|
886
|
+
*vp = JSVAL_FALSE;
|
|
887
|
+
|
|
888
|
+
if (!JSVERSION_IS_ECMA(version)) {
|
|
889
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
890
|
+
JSJMSG_JOBJECT_PROP_DELETE);
|
|
891
|
+
return JS_FALSE;
|
|
892
|
+
} else {
|
|
893
|
+
/* Attempts to delete permanent properties are silently ignored
|
|
894
|
+
by ECMAScript. */
|
|
895
|
+
return JS_TRUE;
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
900
|
+
JavaObject_defaultValue(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
|
|
901
|
+
{
|
|
902
|
+
/* printf("In JavaObject_defaultValue()\n"); */
|
|
903
|
+
return JavaObject_convert(cx, obj, type, vp);
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
907
|
+
JavaObject_newEnumerate(JSContext *cx, JSObject *obj, JSIterateOp enum_op,
|
|
908
|
+
jsval *statep, jsid *idp)
|
|
909
|
+
{
|
|
910
|
+
JavaObjectWrapper *java_wrapper;
|
|
911
|
+
JavaMemberDescriptor *member_descriptor;
|
|
912
|
+
JavaClassDescriptor *class_descriptor;
|
|
913
|
+
JNIEnv *jEnv;
|
|
914
|
+
JSJavaThreadState *jsj_env;
|
|
915
|
+
|
|
916
|
+
java_wrapper = JS_GetPrivate(cx, obj);
|
|
917
|
+
/* Check for prototype object */
|
|
918
|
+
if (!java_wrapper) {
|
|
919
|
+
*statep = JSVAL_NULL;
|
|
920
|
+
if (idp)
|
|
921
|
+
*idp = INT_TO_JSVAL(0);
|
|
922
|
+
return JS_TRUE;
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
class_descriptor = java_wrapper->class_descriptor;
|
|
926
|
+
|
|
927
|
+
switch(enum_op) {
|
|
928
|
+
case JSENUMERATE_INIT:
|
|
929
|
+
|
|
930
|
+
/* Get the Java per-thread environment pointer for this JSContext */
|
|
931
|
+
jsj_env = jsj_EnterJava(cx, &jEnv);
|
|
932
|
+
if (!jEnv)
|
|
933
|
+
return JS_FALSE;
|
|
934
|
+
|
|
935
|
+
member_descriptor = jsj_GetClassInstanceMembers(cx, jEnv, class_descriptor);
|
|
936
|
+
*statep = PRIVATE_TO_JSVAL(member_descriptor);
|
|
937
|
+
if (idp)
|
|
938
|
+
*idp = INT_TO_JSVAL(class_descriptor->num_instance_members);
|
|
939
|
+
jsj_ExitJava(jsj_env);
|
|
940
|
+
return JS_TRUE;
|
|
941
|
+
|
|
942
|
+
case JSENUMERATE_NEXT:
|
|
943
|
+
member_descriptor = JSVAL_TO_PRIVATE(*statep);
|
|
944
|
+
if (member_descriptor) {
|
|
945
|
+
|
|
946
|
+
/* Don't enumerate explicit-signature methods, i.e. enumerate toValue,
|
|
947
|
+
but not toValue(int), toValue(double), etc. */
|
|
948
|
+
while (member_descriptor->methods && member_descriptor->methods->is_alias) {
|
|
949
|
+
member_descriptor = member_descriptor->next;
|
|
950
|
+
if (!member_descriptor) {
|
|
951
|
+
*statep = JSVAL_NULL;
|
|
952
|
+
return JS_TRUE;
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
*idp = member_descriptor->id;
|
|
957
|
+
*statep = PRIVATE_TO_JSVAL(member_descriptor->next);
|
|
958
|
+
return JS_TRUE;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/* Fall through ... */
|
|
962
|
+
|
|
963
|
+
case JSENUMERATE_DESTROY:
|
|
964
|
+
*statep = JSVAL_NULL;
|
|
965
|
+
return JS_TRUE;
|
|
966
|
+
|
|
967
|
+
default:
|
|
968
|
+
JS_ASSERT(0);
|
|
969
|
+
return JS_FALSE;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
JS_STATIC_DLL_CALLBACK(JSBool)
|
|
974
|
+
JavaObject_checkAccess(JSContext *cx, JSObject *obj, jsid id,
|
|
975
|
+
JSAccessMode mode, jsval *vp, uintN *attrsp)
|
|
976
|
+
{
|
|
977
|
+
switch (mode) {
|
|
978
|
+
case JSACC_WATCH:
|
|
979
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
980
|
+
JSJMSG_JOBJECT_PROP_WATCH);
|
|
981
|
+
return JS_FALSE;
|
|
982
|
+
|
|
983
|
+
case JSACC_IMPORT:
|
|
984
|
+
JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,
|
|
985
|
+
JSJMSG_JOBJECT_PROP_EXPORT);
|
|
986
|
+
return JS_FALSE;
|
|
987
|
+
|
|
988
|
+
default:
|
|
989
|
+
return JS_TRUE;
|
|
990
|
+
}
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
#define JSJ_SLOT_COUNT (JSSLOT_PRIVATE+1)
|
|
994
|
+
|
|
995
|
+
JSObjectMap * JS_DLL_CALLBACK
|
|
996
|
+
jsj_wrapper_newObjectMap(JSContext *cx, jsrefcount nrefs, JSObjectOps *ops,
|
|
997
|
+
JSClass *clasp, JSObject *obj)
|
|
998
|
+
{
|
|
999
|
+
JSObjectMap * map;
|
|
1000
|
+
|
|
1001
|
+
map = (JSObjectMap *) JS_malloc(cx, sizeof(JSObjectMap));
|
|
1002
|
+
if (map) {
|
|
1003
|
+
map->nrefs = nrefs;
|
|
1004
|
+
map->ops = ops;
|
|
1005
|
+
map->nslots = JSJ_SLOT_COUNT;
|
|
1006
|
+
map->freeslot = JSJ_SLOT_COUNT;
|
|
1007
|
+
}
|
|
1008
|
+
return map;
|
|
1009
|
+
}
|
|
1010
|
+
|
|
1011
|
+
void JS_DLL_CALLBACK
|
|
1012
|
+
jsj_wrapper_destroyObjectMap(JSContext *cx, JSObjectMap *map)
|
|
1013
|
+
{
|
|
1014
|
+
JS_free(cx, map);
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
jsval JS_DLL_CALLBACK
|
|
1018
|
+
jsj_wrapper_getRequiredSlot(JSContext *cx, JSObject *obj, uint32 slot)
|
|
1019
|
+
{
|
|
1020
|
+
JS_ASSERT(slot < JSJ_SLOT_COUNT);
|
|
1021
|
+
JS_ASSERT(obj->slots);
|
|
1022
|
+
JS_ASSERT(obj->map->nslots == JSJ_SLOT_COUNT);
|
|
1023
|
+
JS_ASSERT(obj->map->freeslot == JSJ_SLOT_COUNT);
|
|
1024
|
+
return obj->slots[slot];
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
JSBool JS_DLL_CALLBACK
|
|
1028
|
+
jsj_wrapper_setRequiredSlot(JSContext *cx, JSObject *obj, uint32 slot, jsval v)
|
|
1029
|
+
{
|
|
1030
|
+
JS_ASSERT(slot < JSJ_SLOT_COUNT);
|
|
1031
|
+
JS_ASSERT(obj->slots);
|
|
1032
|
+
JS_ASSERT(obj->map->nslots == JSJ_SLOT_COUNT);
|
|
1033
|
+
JS_ASSERT(obj->map->freeslot == JSJ_SLOT_COUNT);
|
|
1034
|
+
obj->slots[slot] = v;
|
|
1035
|
+
return JS_TRUE;
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
JSObjectOps JavaObject_ops = {
|
|
1039
|
+
/* Mandatory non-null function pointer members. */
|
|
1040
|
+
jsj_wrapper_newObjectMap, /* newObjectMap */
|
|
1041
|
+
jsj_wrapper_destroyObjectMap, /* destroyObjectMap */
|
|
1042
|
+
JavaObject_lookupProperty,
|
|
1043
|
+
JavaObject_defineProperty,
|
|
1044
|
+
JavaObject_getPropertyById, /* getProperty */
|
|
1045
|
+
JavaObject_setPropertyById, /* setProperty */
|
|
1046
|
+
JavaObject_getAttributes,
|
|
1047
|
+
JavaObject_setAttributes,
|
|
1048
|
+
JavaObject_deleteProperty,
|
|
1049
|
+
JavaObject_defaultValue,
|
|
1050
|
+
JavaObject_newEnumerate,
|
|
1051
|
+
JavaObject_checkAccess,
|
|
1052
|
+
|
|
1053
|
+
/* Optionally non-null members start here. */
|
|
1054
|
+
NULL, /* thisObject */
|
|
1055
|
+
NULL, /* dropProperty */
|
|
1056
|
+
NULL, /* call */
|
|
1057
|
+
NULL, /* construct */
|
|
1058
|
+
NULL, /* xdrObject */
|
|
1059
|
+
NULL, /* hasInstance */
|
|
1060
|
+
NULL, /* setProto */
|
|
1061
|
+
NULL, /* setParent */
|
|
1062
|
+
NULL, /* mark */
|
|
1063
|
+
NULL, /* clear */
|
|
1064
|
+
jsj_wrapper_getRequiredSlot, /* getRequiredSlot */
|
|
1065
|
+
jsj_wrapper_setRequiredSlot /* setRequiredSlot */
|
|
1066
|
+
};
|
|
1067
|
+
|
|
1068
|
+
JS_STATIC_DLL_CALLBACK(JSObjectOps *)
|
|
1069
|
+
JavaObject_getObjectOps(JSContext *cx, JSClass *clazz)
|
|
1070
|
+
{
|
|
1071
|
+
return &JavaObject_ops;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
JSClass JavaObject_class = {
|
|
1075
|
+
"JavaObject", JSCLASS_HAS_PRIVATE,
|
|
1076
|
+
NULL, NULL, NULL, NULL,
|
|
1077
|
+
NULL, NULL, JavaObject_convert, JavaObject_finalize,
|
|
1078
|
+
|
|
1079
|
+
/* Optionally non-null members start here. */
|
|
1080
|
+
JavaObject_getObjectOps,
|
|
1081
|
+
NULL, /* checkAccess */
|
|
1082
|
+
NULL, /* call */
|
|
1083
|
+
NULL, /* construct */
|
|
1084
|
+
NULL, /* xdrObject */
|
|
1085
|
+
NULL, /* hasInstance */
|
|
1086
|
+
NULL, /* mark */
|
|
1087
|
+
0, /* spare */
|
|
1088
|
+
};
|
|
1089
|
+
|
|
1090
|
+
extern JS_IMPORT_DATA(JSObjectOps) js_ObjectOps;
|
|
1091
|
+
|
|
1092
|
+
JSBool
|
|
1093
|
+
jsj_init_JavaObject(JSContext *cx, JSObject *global_obj)
|
|
1094
|
+
{
|
|
1095
|
+
return JS_InitClass(cx, global_obj,
|
|
1096
|
+
0, &JavaObject_class, 0, 0,
|
|
1097
|
+
0, 0,
|
|
1098
|
+
0, 0) != 0;
|
|
1099
|
+
}
|