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,1100 @@
|
|
|
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 the GNU General Public License Version 2 or later (the "GPL"), or
|
|
28
|
+
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
29
|
+
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
30
|
+
* of those above. If you wish to allow use of your version of this file only
|
|
31
|
+
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
32
|
+
* use your version of this file under the terms of the MPL, indicate your
|
|
33
|
+
* decision by deleting the provisions above and replace them with the notice
|
|
34
|
+
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
35
|
+
* the provisions above, a recipient may use your version of this file under
|
|
36
|
+
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
37
|
+
*
|
|
38
|
+
* ***** END LICENSE BLOCK ***** */
|
|
39
|
+
|
|
40
|
+
/*
|
|
41
|
+
* PerlConnect module.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
The first two headers are from the Perl distribution.
|
|
46
|
+
Play with "perl -MExtUtils::Embed -e ccopts -e ldopts"
|
|
47
|
+
to find out which directories should be included. Refer
|
|
48
|
+
to perlembed man page for more info.
|
|
49
|
+
*/
|
|
50
|
+
#include "EXTERN.h"
|
|
51
|
+
#include "perl.h"
|
|
52
|
+
#include "XSUB.h"
|
|
53
|
+
|
|
54
|
+
#include <jsapi.h>
|
|
55
|
+
#include <string.h>
|
|
56
|
+
|
|
57
|
+
/*---------------------------------------------------------------------------*/
|
|
58
|
+
/* PerlConnect. Provides means for OO JS <==> Perl communications */
|
|
59
|
+
/* See README.html for more info on PerlConnect. Look for TODO in this file */
|
|
60
|
+
/* for things that are bogus or not completely implemented. Has been tested */
|
|
61
|
+
/* with 5.004 only */
|
|
62
|
+
/*---------------------------------------------------------------------------*/
|
|
63
|
+
|
|
64
|
+
/* Forward declarations */
|
|
65
|
+
static JSBool PerlConstruct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *v);
|
|
66
|
+
static void PerlFinalize(JSContext *cx, JSObject *obj);
|
|
67
|
+
static JSBool perl_eval(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval);
|
|
68
|
+
static JSBool perl_call(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval);
|
|
69
|
+
static JSBool perl_use(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval);
|
|
70
|
+
static JSBool use(JSContext *cx, JSObject *obj, int argc, jsval *argv, const char* t);
|
|
71
|
+
static JSBool PMGetProperty(JSContext *cx, JSObject *obj, jsval name, jsval* rval);
|
|
72
|
+
static JSBool PMSetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval);
|
|
73
|
+
static JSBool PerlToString(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval);
|
|
74
|
+
static JSBool processReturn(JSContext *cx, JSObject *obj, jsval* rval);
|
|
75
|
+
static JSBool checkError(JSContext *cx);
|
|
76
|
+
static JSBool PMToString(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval);
|
|
77
|
+
static JSBool PVToString(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval);
|
|
78
|
+
static SV* PVGetRef(JSContext *cx, JSObject *obj);
|
|
79
|
+
static JSBool PVGetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval);
|
|
80
|
+
static JSBool PVSetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval);
|
|
81
|
+
static JSBool PVGetElement(JSContext *cx, JSObject *obj, jsint index, jsval *rval);
|
|
82
|
+
static JSBool PVSetElement(JSContext *cx, JSObject *obj, jsint index, jsval v);
|
|
83
|
+
static JSBool PVGetKey(JSContext *cx, JSObject *obj, char* name, jsval *rval);
|
|
84
|
+
static JSBool PVSetKey(JSContext *cx, JSObject *obj, char* name, jsval v);
|
|
85
|
+
static JSBool PVConvert(JSContext *cx, JSObject *obj, JSType type, jsval *v);
|
|
86
|
+
static void PVFinalize(JSContext *cx, JSObject *obj);
|
|
87
|
+
/* Exported functions */
|
|
88
|
+
JS_EXPORT_API(JSObject*) JS_InitPerlClass(JSContext *cx, JSObject *obj);
|
|
89
|
+
JS_EXPORT_API(JSBool) JSVALToSV(JSContext *cx, JSObject *obj, jsval v, SV** sv);
|
|
90
|
+
JS_EXPORT_API(JSBool) SVToJSVAL(JSContext *cx, JSObject *obj, SV *ref, jsval *rval);
|
|
91
|
+
|
|
92
|
+
/*
|
|
93
|
+
The following is required by the Perl dynamic loading mechanism to
|
|
94
|
+
link with modules that use C properly. See perlembed man page for details.
|
|
95
|
+
This allows things like sockets to be called via PerlConnect.
|
|
96
|
+
*/
|
|
97
|
+
#ifdef __cplusplus
|
|
98
|
+
# define EXTERN_C extern "C"
|
|
99
|
+
#else
|
|
100
|
+
# define EXTERN_C extern
|
|
101
|
+
#endif
|
|
102
|
+
|
|
103
|
+
EXTERN_C void boot_DynaLoader _((CV* cv));
|
|
104
|
+
EXTERN_C void
|
|
105
|
+
xs_init()
|
|
106
|
+
{
|
|
107
|
+
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, __FILE__);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* These properties are not processed by the getter for PerlValue */
|
|
111
|
+
static char* predefined_methods[] = {"toString", "valueOf", "type", "length"};
|
|
112
|
+
|
|
113
|
+
/* Represents a perl interpreter */
|
|
114
|
+
JSClass perlClass = {
|
|
115
|
+
"Perl", JSCLASS_HAS_PRIVATE,
|
|
116
|
+
JS_PropertyStub, JS_PropertyStub, PMGetProperty, /*PMSetProperty*/JS_PropertyStub,
|
|
117
|
+
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, PerlFinalize
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
static JSFunctionSpec perlMethods[] = {
|
|
121
|
+
{"toString", (JSNative)PerlToString, 0},
|
|
122
|
+
{"eval", (JSNative)perl_eval, 0},
|
|
123
|
+
{"call", (JSNative)perl_call, 0},
|
|
124
|
+
{"use", (JSNative)perl_use, 0},
|
|
125
|
+
{ NULL, NULL,0 }
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
/* Represents a Perl module */
|
|
130
|
+
JSClass perlModuleClass = {
|
|
131
|
+
"PerlModule", JSCLASS_HAS_PRIVATE,
|
|
132
|
+
JS_PropertyStub, JS_PropertyStub, PMGetProperty, JS_PropertyStub,
|
|
133
|
+
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
JSFunctionSpec perlModuleMethods[] = {
|
|
137
|
+
{"toString", (JSNative)PMToString, 0},
|
|
138
|
+
{ NULL, NULL,0 }
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
/* Represents a value returned from Perl */
|
|
143
|
+
JSClass perlValueClass = {
|
|
144
|
+
"PerlValue", JSCLASS_HAS_PRIVATE,
|
|
145
|
+
JS_PropertyStub, JS_PropertyStub, PVGetProperty, PVSetProperty,
|
|
146
|
+
JS_EnumerateStub, JS_ResolveStub, PVConvert, PVFinalize
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
JSFunctionSpec perlValueMethods[] = {
|
|
150
|
+
{"toString", (JSNative)PVToString, 0},
|
|
151
|
+
{ NULL, NULL, 0}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/*
|
|
155
|
+
Initializes Perl class. Should be called by applications that
|
|
156
|
+
want to enable PerlConnect. This will probably preload the Perl
|
|
157
|
+
DLL even though Perl might not actually be used. We may postpone
|
|
158
|
+
this and load the DLL at runtime after the constructor is called.
|
|
159
|
+
*/
|
|
160
|
+
static JSObject*
|
|
161
|
+
js_InitPerlClass(JSContext *cx, JSObject *obj)
|
|
162
|
+
{
|
|
163
|
+
jsval v;
|
|
164
|
+
JSObject *module;
|
|
165
|
+
JSString *mainString = JS_NewStringCopyZ(cx, "main");
|
|
166
|
+
if (!mainString)
|
|
167
|
+
return NULL;
|
|
168
|
+
v = STRING_TO_JSVAL(mainString);
|
|
169
|
+
module = JS_NewObject(cx, &perlModuleClass, NULL, obj);
|
|
170
|
+
if (!module)
|
|
171
|
+
return NULL;
|
|
172
|
+
|
|
173
|
+
if (!JS_DefineFunctions(cx, module, perlModuleMethods))
|
|
174
|
+
return NULL;
|
|
175
|
+
|
|
176
|
+
JS_SetProperty(cx, module, "path", &v);
|
|
177
|
+
|
|
178
|
+
return JS_InitClass(cx, obj, module, &perlClass, PerlConstruct, 0,
|
|
179
|
+
NULL, NULL, NULL, NULL);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* Public wrapper for the function above */
|
|
183
|
+
JSObject*
|
|
184
|
+
JS_InitPerlClass(JSContext *cx, JSObject *obj)
|
|
185
|
+
{
|
|
186
|
+
return js_InitPerlClass(cx, obj);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/*
|
|
190
|
+
Perl constructor. Allocates a new interpreter and defines methods on it.
|
|
191
|
+
The constuctor is sort of bogus in that it doesn't create a new namespace
|
|
192
|
+
and all the variables defined in one instance of the Perl object will be
|
|
193
|
+
visible in others. In the future, I think it may be a good idea to use
|
|
194
|
+
Safe.pm to provide independent contexts for different Perl objects and
|
|
195
|
+
prohibit certain operations (like exit(), alarm(), die(), etc.). Or we
|
|
196
|
+
may simple disallow calling the constuctor more than once.
|
|
197
|
+
*/
|
|
198
|
+
static JSBool
|
|
199
|
+
PerlConstruct(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *v)
|
|
200
|
+
{
|
|
201
|
+
PerlInterpreter *perl;
|
|
202
|
+
JSObject *perlObject;
|
|
203
|
+
JSBool ok;
|
|
204
|
+
char *embedding[] = {"", "-e", "0"};
|
|
205
|
+
char *t = "use PerlConnect qw(perl_eval perl_resolve perl_call $js $ver);";
|
|
206
|
+
|
|
207
|
+
/* create a new interpreter */
|
|
208
|
+
perl = perl_alloc();
|
|
209
|
+
|
|
210
|
+
if(perl==NULL){
|
|
211
|
+
JS_ReportError(cx, "Can't allocate a new interpreter");
|
|
212
|
+
return JS_FALSE;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
perl_construct(perl);
|
|
216
|
+
if(perl_parse(perl, xs_init, 3, embedding, NULL)){
|
|
217
|
+
JS_ReportError(cx, "Parsing failed");
|
|
218
|
+
return JS_FALSE;
|
|
219
|
+
}
|
|
220
|
+
if(perl_run(perl)){
|
|
221
|
+
JS_ReportError(cx, "Run failed");
|
|
222
|
+
return JS_FALSE;
|
|
223
|
+
}
|
|
224
|
+
ok = use(cx, obj, argc, argv, t);
|
|
225
|
+
|
|
226
|
+
/* make it into an object */
|
|
227
|
+
perlObject = JS_NewObject(cx, &perlClass, NULL, NULL);
|
|
228
|
+
if(!perlObject)
|
|
229
|
+
return JS_FALSE;
|
|
230
|
+
if(!JS_DefineFunctions(cx, perlObject, perlMethods))
|
|
231
|
+
return JS_FALSE;
|
|
232
|
+
JS_SetPrivate(cx, perlObject, perl);
|
|
233
|
+
*v = OBJECT_TO_JSVAL(perlObject);
|
|
234
|
+
return ok;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* Destructor. Deallocates the interpreter */
|
|
238
|
+
static void
|
|
239
|
+
PerlFinalize(JSContext *cx, JSObject *obj)
|
|
240
|
+
{
|
|
241
|
+
PerlInterpreter *perl = JS_GetPrivate(cx, obj);
|
|
242
|
+
if (perl) {
|
|
243
|
+
perl_destruct(perl);
|
|
244
|
+
perl_free(perl);
|
|
245
|
+
}
|
|
246
|
+
/* return JS_TRUE; */
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/*
|
|
250
|
+
Returns a string representation of the Perl interpreter.
|
|
251
|
+
Can add printing of the Perl version, @ISA, etc., like the
|
|
252
|
+
output produced by perl -V. Can also make certain variables
|
|
253
|
+
available off the Perl object, like Perl.version, etc.
|
|
254
|
+
*/
|
|
255
|
+
static JSBool
|
|
256
|
+
PerlToString(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval){
|
|
257
|
+
JSString *imported;
|
|
258
|
+
SV* sv = perl_get_sv("JS::ver", FALSE);
|
|
259
|
+
if (!sv) {
|
|
260
|
+
JS_ReportOutOfMemory(cx);
|
|
261
|
+
return JS_FALSE;
|
|
262
|
+
}
|
|
263
|
+
imported = JS_NewStringCopyZ(cx, SvPV(sv, PL_na));
|
|
264
|
+
if (!imported)
|
|
265
|
+
return JS_FALSE;
|
|
266
|
+
*rval = STRING_TO_JSVAL(imported);
|
|
267
|
+
return JS_TRUE;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/*
|
|
271
|
+
Evaluates the first parameter in Perl and put the eval's
|
|
272
|
+
return value into *rval. The return value is of type PerlValue.
|
|
273
|
+
This procedure uses JS::perl_eval. Example of use of perl.eval():
|
|
274
|
+
p = new Perl();
|
|
275
|
+
str = p.eval("'-' x 80"); // str contains 80 dashes
|
|
276
|
+
*/
|
|
277
|
+
static JSBool
|
|
278
|
+
perl_eval(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval)
|
|
279
|
+
{
|
|
280
|
+
char *statement;
|
|
281
|
+
char *args[] = {NULL, NULL}; /* two elements */
|
|
282
|
+
|
|
283
|
+
if(argc!=1){
|
|
284
|
+
JS_ReportError(cx, "Perl.eval expects one parameter");
|
|
285
|
+
return JS_FALSE;
|
|
286
|
+
}
|
|
287
|
+
statement = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
|
|
288
|
+
|
|
289
|
+
args[0] = statement;
|
|
290
|
+
perl_call_argv("JS::perl_eval", G_SCALAR|G_KEEPERR|G_EVAL, args);
|
|
291
|
+
return processReturn(cx, obj, rval);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/*
|
|
295
|
+
Call the perl procedure specified as the first argument and
|
|
296
|
+
pass all the other arguments as parameters. The return value
|
|
297
|
+
is returned in *rval. Example of use of perl.call():
|
|
298
|
+
p = new Perl('Time::gmtime');
|
|
299
|
+
time = p.call("Time::gmtime::gmtime"); // time is now the following array:
|
|
300
|
+
// [40,42,1,22,6,98,3,202,0]
|
|
301
|
+
NB: The full function name has to be supplied, i.e. Time::gmtime::gmtime
|
|
302
|
+
instead of gmtime unless gmtime is exported into the current package.
|
|
303
|
+
|
|
304
|
+
This method is also used when one uses the full package name syntax like
|
|
305
|
+
this:
|
|
306
|
+
p = new Perl("Sys::Hostname", "JS")
|
|
307
|
+
result = p.JS.c(1, 2, 4)
|
|
308
|
+
p.hostname()
|
|
309
|
+
|
|
310
|
+
This gets called from PMGetProperty, which creates a
|
|
311
|
+
function whose native method is perl_call. Also see
|
|
312
|
+
JS::perl_call.
|
|
313
|
+
*/
|
|
314
|
+
static JSBool
|
|
315
|
+
perl_call(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval)
|
|
316
|
+
{
|
|
317
|
+
JSBool ok;
|
|
318
|
+
int count, i;
|
|
319
|
+
char* fun_name;
|
|
320
|
+
SV *sv;
|
|
321
|
+
dSP;
|
|
322
|
+
|
|
323
|
+
/* Differetiate between direct and method-like call */
|
|
324
|
+
if((JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION) &&
|
|
325
|
+
strcmp("call", JS_GetFunctionName(JS_ValueToFunction(cx, argv[-2])))){
|
|
326
|
+
fun_name = (char*)JS_GetFunctionName(JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[-2])));
|
|
327
|
+
i=0;
|
|
328
|
+
}else{
|
|
329
|
+
fun_name = JS_GetStringBytes(JS_ValueToString(cx, argv[0]));
|
|
330
|
+
i=1;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
PUSHMARK(sp);
|
|
334
|
+
XPUSHs(sv_2mortal(newSVpv(fun_name,0)));
|
|
335
|
+
|
|
336
|
+
for(;i<argc;i++){
|
|
337
|
+
JSVALToSV(cx, obj, argv[i], &sv);
|
|
338
|
+
XPUSHs(sv);
|
|
339
|
+
}
|
|
340
|
+
PUTBACK;
|
|
341
|
+
|
|
342
|
+
count = perl_call_sv(newSVpv("JS::perl_call", 0), G_KEEPERR|G_SCALAR|G_EVAL|G_DISCARD);
|
|
343
|
+
if(count!=0){
|
|
344
|
+
JS_ReportError(cx, "Implementation error: count=%d, must be 0!\n", count);
|
|
345
|
+
return JS_FALSE;
|
|
346
|
+
}
|
|
347
|
+
ok = processReturn(cx, obj, rval);
|
|
348
|
+
|
|
349
|
+
return ok;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/*
|
|
353
|
+
Loads Perl libraries specified as arguments.
|
|
354
|
+
*/
|
|
355
|
+
static JSBool
|
|
356
|
+
perl_use(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval)
|
|
357
|
+
{
|
|
358
|
+
return use(cx, obj, argc, argv, NULL);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/*
|
|
362
|
+
Utility function used by perl_use and Perl's constructor.
|
|
363
|
+
Executes use lib1; use lib2, etc. in the current interpreter.
|
|
364
|
+
*/
|
|
365
|
+
static JSBool
|
|
366
|
+
use(JSContext *cx, JSObject *obj, int argc, jsval *argv, const char* t){
|
|
367
|
+
char *evalStr = JS_malloc(cx, t?strlen(t)+1:1);
|
|
368
|
+
int i;
|
|
369
|
+
|
|
370
|
+
if (!evalStr)
|
|
371
|
+
return JS_FALSE;
|
|
372
|
+
|
|
373
|
+
strcpy(evalStr, t?t:"");
|
|
374
|
+
|
|
375
|
+
for(i=0;i<argc;i++){
|
|
376
|
+
char *arg = JS_GetStringBytes(JS_ValueToString(cx, argv[i])), *tmp, old[256];
|
|
377
|
+
|
|
378
|
+
/* call use() on every parameter */
|
|
379
|
+
strcpy(old, evalStr);
|
|
380
|
+
JS_free(cx, evalStr);
|
|
381
|
+
tmp = JS_malloc(cx, strlen(old)+strlen(arg)+6);
|
|
382
|
+
if (!tmp)
|
|
383
|
+
return JS_FALSE;
|
|
384
|
+
sprintf(tmp, "%suse %s;", old, arg);
|
|
385
|
+
evalStr = tmp;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
perl_eval_sv(newSVpv(evalStr, 0), G_KEEPERR);
|
|
389
|
+
|
|
390
|
+
checkError(cx);
|
|
391
|
+
JS_free(cx, evalStr);
|
|
392
|
+
return JS_TRUE;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/*
|
|
396
|
+
Looks at $@ to see if there was an error. Used by
|
|
397
|
+
perl_eval, perl_call, etc.
|
|
398
|
+
*/
|
|
399
|
+
static JSBool
|
|
400
|
+
checkError(JSContext *cx)
|
|
401
|
+
{
|
|
402
|
+
if(SvTRUE(GvSV(PL_errgv))){
|
|
403
|
+
JS_ReportError(cx, "perl eval failed: %s",
|
|
404
|
+
SvPV(GvSV(PL_errgv), PL_na));
|
|
405
|
+
/* clear error status. there should be a way to do this faster */
|
|
406
|
+
perl_eval_sv(newSVpv("undef $@;", 0), G_KEEPERR);
|
|
407
|
+
return JS_FALSE;
|
|
408
|
+
}
|
|
409
|
+
return JS_TRUE;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/*
|
|
413
|
+
Take the value of $JS::js and convert in to a jsval. It's stotred
|
|
414
|
+
in *rval. perl_eval and perl_call use $JS::js to store return results.
|
|
415
|
+
*/
|
|
416
|
+
static JSBool
|
|
417
|
+
processReturn(JSContext *cx, JSObject *obj, jsval* rval)
|
|
418
|
+
{
|
|
419
|
+
SV *js;
|
|
420
|
+
|
|
421
|
+
js = perl_get_sv("JS::js", FALSE);
|
|
422
|
+
|
|
423
|
+
if(!js || !SvOK(js)){
|
|
424
|
+
*rval = JSVAL_VOID;
|
|
425
|
+
/* XXX isn't this wrong? */
|
|
426
|
+
return JS_FALSE;
|
|
427
|
+
}
|
|
428
|
+
if(!SvROK(js)){
|
|
429
|
+
JS_ReportError(cx, "$js (%s) must be of reference type", SvPV(js,PL_na));
|
|
430
|
+
return JS_FALSE;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
checkError(cx);
|
|
434
|
+
|
|
435
|
+
return SVToJSVAL(cx, obj, js, rval);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/*
|
|
439
|
+
Implements namespace-like syntax that maps Perl packages to
|
|
440
|
+
JS objects. One can say
|
|
441
|
+
p = new Perl('Foo::Bar')
|
|
442
|
+
and then call
|
|
443
|
+
a = p.Foo.Bar.f()
|
|
444
|
+
or access variables exported from those packages like this:
|
|
445
|
+
a = p.Foo.Bar["$var"]
|
|
446
|
+
this syntax will also work:
|
|
447
|
+
a = p.Foo.Bar.$var
|
|
448
|
+
but if you want to access non-scalar values, you must use the subscript syntax:
|
|
449
|
+
p.Foo.Bar["@arr"]
|
|
450
|
+
and
|
|
451
|
+
p.Foo.Bar["%hash"]
|
|
452
|
+
*/
|
|
453
|
+
static JSBool
|
|
454
|
+
PMGetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval)
|
|
455
|
+
{
|
|
456
|
+
char *last = JS_GetStringBytes(JS_ValueToString(cx, name)), *path, package[256];
|
|
457
|
+
char *args[] = {NULL, NULL};
|
|
458
|
+
char *predefined_methods[] = {"toString", "eval", "call", "use", "path"};
|
|
459
|
+
int count;
|
|
460
|
+
SV *js;
|
|
461
|
+
jsval v;
|
|
462
|
+
int i;
|
|
463
|
+
|
|
464
|
+
for(i=0;i<sizeof(predefined_methods)/sizeof(char*);i++){
|
|
465
|
+
if(!strcmp(predefined_methods[i], last)){
|
|
466
|
+
return JS_TRUE;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
JS_GetProperty(cx, obj, "path", &v);
|
|
471
|
+
path = JS_GetStringBytes(JS_ValueToString(cx, v));
|
|
472
|
+
sprintf(package, "%s::%s", path, last);
|
|
473
|
+
args[0] = package;
|
|
474
|
+
|
|
475
|
+
count = perl_call_argv("JS::perl_resolve", G_KEEPERR|G_SCALAR|G_EVAL|G_DISCARD, args);
|
|
476
|
+
if(count!=0){
|
|
477
|
+
JS_ReportError(cx, "Implementation error: count=%d, must be 0!\n", count);
|
|
478
|
+
return JS_FALSE;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
checkError(cx);
|
|
482
|
+
|
|
483
|
+
js = perl_get_sv("JS::js", FALSE);
|
|
484
|
+
|
|
485
|
+
if(js && SvOK(js)){
|
|
486
|
+
if(SvROK(js)){
|
|
487
|
+
SVToJSVAL(cx, obj, js, rval);
|
|
488
|
+
}else{
|
|
489
|
+
/* defined function */
|
|
490
|
+
if(SvIV(js) == 1){
|
|
491
|
+
JSFunction *f = JS_NewFunction(cx, (JSNative)perl_call, 0, 0, NULL, package);
|
|
492
|
+
if (!f) {
|
|
493
|
+
return JS_FALSE;
|
|
494
|
+
}
|
|
495
|
+
*rval = OBJECT_TO_JSVAL(JS_GetFunctionObject(f));
|
|
496
|
+
}else
|
|
497
|
+
if(SvIV(js) == 2){
|
|
498
|
+
JSObject *module;
|
|
499
|
+
JSString *packageString;
|
|
500
|
+
module = JS_NewObject(cx, &perlModuleClass, NULL, obj);
|
|
501
|
+
packageString = JS_NewStringCopyZ(cx,package);
|
|
502
|
+
if (!module || !packageString) {
|
|
503
|
+
return JS_FALSE;
|
|
504
|
+
}
|
|
505
|
+
v = (js && SvTRUE(js))?STRING_TO_JSVAL(packageString):JSVAL_VOID;
|
|
506
|
+
JS_SetProperty(cx, module, "path", &v);
|
|
507
|
+
*rval = OBJECT_TO_JSVAL(module);
|
|
508
|
+
}else{
|
|
509
|
+
JS_ReportError(cx, "Symbol %s is not defined", package);
|
|
510
|
+
*rval = JSVAL_VOID;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
return JS_TRUE;
|
|
514
|
+
}else{
|
|
515
|
+
JS_ReportError(cx, "failure");
|
|
516
|
+
return JS_FALSE;
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/*
|
|
521
|
+
Gets called when a Perl value gets assigned to like this:
|
|
522
|
+
p.Foo.Bar["$var"] = 100
|
|
523
|
+
*/
|
|
524
|
+
static JSBool
|
|
525
|
+
PMSetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval)
|
|
526
|
+
{
|
|
527
|
+
/* TODO: just call SVToJSVAL() and make the assignment. */
|
|
528
|
+
return JS_TRUE;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/*
|
|
532
|
+
toString() for PerlModule. Prints the path the module represents.
|
|
533
|
+
Note that the path doesn't necessarily have to be valid. We don't
|
|
534
|
+
have a way to check that until we call a function from that package.
|
|
535
|
+
TODO: In 5.005 exists Foo::{Bar::} checks is Foo::{Bar::} exists.
|
|
536
|
+
We can use this to validate package names.
|
|
537
|
+
*/
|
|
538
|
+
static JSBool
|
|
539
|
+
PMToString(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval){
|
|
540
|
+
char str[256];
|
|
541
|
+
JSString *s, *newString;
|
|
542
|
+
jsval v;
|
|
543
|
+
|
|
544
|
+
JS_GetProperty(cx, obj, "path", &v);
|
|
545
|
+
s = JSVAL_TO_STRING(v);
|
|
546
|
+
sprintf(str, "[PerlModule %s]", JS_GetStringBytes(s));
|
|
547
|
+
newString = JS_NewStringCopyZ(cx, str);
|
|
548
|
+
if (!newString)
|
|
549
|
+
return JS_FALSE;
|
|
550
|
+
*rval = STRING_TO_JSVAL(newString);
|
|
551
|
+
return JS_TRUE;
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
/*
|
|
555
|
+
Helped method. Retrieves the Perl reference stored
|
|
556
|
+
in PerlValue object as private data.
|
|
557
|
+
*/
|
|
558
|
+
|
|
559
|
+
#include <stdio.h>
|
|
560
|
+
|
|
561
|
+
static SV*
|
|
562
|
+
PVGetRef(JSContext *cx, JSObject *obj)
|
|
563
|
+
{
|
|
564
|
+
SV* ref;
|
|
565
|
+
|
|
566
|
+
ref = (SV*)JS_GetInstancePrivate(cx, obj, &perlValueClass, NULL);
|
|
567
|
+
|
|
568
|
+
if(!ref || !SvOK(ref) || !SvROK(ref)){
|
|
569
|
+
JS_ReportError(cx, "Can't extract ref");
|
|
570
|
+
return NULL;
|
|
571
|
+
}
|
|
572
|
+
return ref;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
static JSBool
|
|
576
|
+
PVCallStub (JSContext *cx, JSObject *obj, uintN argc,
|
|
577
|
+
jsval *argv, jsval *rval) {
|
|
578
|
+
JSFunction *fun;
|
|
579
|
+
int i, cnt;
|
|
580
|
+
I32 ax;
|
|
581
|
+
SV *sv, *perl_object;
|
|
582
|
+
GV *gv;
|
|
583
|
+
HV *stash;
|
|
584
|
+
char *name;
|
|
585
|
+
|
|
586
|
+
dSP;
|
|
587
|
+
|
|
588
|
+
fun = JS_ValueToFunction(cx, argv[-2]);
|
|
589
|
+
perl_object = PVGetRef(cx, obj);
|
|
590
|
+
|
|
591
|
+
fun = JS_ValueToFunction(cx, argv[-2]);
|
|
592
|
+
name = (char*) JS_GetFunctionName(fun);
|
|
593
|
+
|
|
594
|
+
stash = SvSTASH(SvRV(perl_object));
|
|
595
|
+
gv = gv_fetchmeth(stash, name, strlen(name), 0);
|
|
596
|
+
/* cnt = perl_call_pv(method_name, 0); */
|
|
597
|
+
/* start of perl call stuff */
|
|
598
|
+
if (! gv) {
|
|
599
|
+
char msg[256];
|
|
600
|
+
sprintf(msg, "Method ``%s'' not defined", name);
|
|
601
|
+
JS_ReportError(cx, msg);
|
|
602
|
+
return JS_FALSE;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
ENTER;
|
|
606
|
+
SAVETMPS;
|
|
607
|
+
PUSHMARK(SP);
|
|
608
|
+
//SvREFCNT_inc(perl_object);
|
|
609
|
+
XPUSHs(perl_object); /* self for perl object method */
|
|
610
|
+
for (i = 0; i < argc; i++) {
|
|
611
|
+
//sv = sv_newmortal();
|
|
612
|
+
JSVALToSV(cx, obj, argv[i], &sv);
|
|
613
|
+
//sv_2mortal(sv);
|
|
614
|
+
XPUSHs(sv);
|
|
615
|
+
}
|
|
616
|
+
PUTBACK;
|
|
617
|
+
|
|
618
|
+
cnt = perl_call_sv((SV*)GvCV(gv), G_ARRAY | G_KEEPERR | G_EVAL);
|
|
619
|
+
|
|
620
|
+
//SvREFCNT_dec(perl_object);
|
|
621
|
+
|
|
622
|
+
SPAGAIN;
|
|
623
|
+
/* adjust stack for use of ST macro (see perlcall) */
|
|
624
|
+
SP -= cnt;
|
|
625
|
+
ax = (SP - PL_stack_base) + 1;
|
|
626
|
+
|
|
627
|
+
/* read value(s) */
|
|
628
|
+
if (cnt == 1) {
|
|
629
|
+
SVToJSVAL(cx, obj, ST(0), rval);
|
|
630
|
+
} else {
|
|
631
|
+
JSObject *jsarr;
|
|
632
|
+
jsval val;
|
|
633
|
+
int i;
|
|
634
|
+
jsarr = JS_NewArrayObject(cx, 0, NULL);
|
|
635
|
+
for (i = 0; i < cnt; i++) {
|
|
636
|
+
SVToJSVAL(cx, JS_GetGlobalObject(cx), ST(i), &val);
|
|
637
|
+
JS_DefineElement(cx, jsarr, i, val, NULL, NULL, 0);
|
|
638
|
+
}
|
|
639
|
+
*rval = OBJECT_TO_JSVAL(jsarr);
|
|
640
|
+
}
|
|
641
|
+
PUTBACK;
|
|
642
|
+
|
|
643
|
+
FREETMPS;
|
|
644
|
+
LEAVE;
|
|
645
|
+
|
|
646
|
+
//return(JS_TRUE);
|
|
647
|
+
return checkError(cx);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/*
|
|
651
|
+
Retrieve property from PerlValue object by its name. Tries
|
|
652
|
+
to look at the PerlValue object both as a hash and array.
|
|
653
|
+
If the index is numerical, then it looks at the array part
|
|
654
|
+
first. *rval contains the result.
|
|
655
|
+
*/
|
|
656
|
+
/* __PH__
|
|
657
|
+
...but. PVGetproperty now firstly looks for method in given
|
|
658
|
+
object package. If such method if found, then is returned
|
|
659
|
+
universal method stub. Sideeffect of this behavior is, that
|
|
660
|
+
method are looked first before properties of the same name.
|
|
661
|
+
|
|
662
|
+
Second problem is security. In this way any perl method could
|
|
663
|
+
be called. We pay security leak for this. May be we could
|
|
664
|
+
support some Perl exporting process (via some package global
|
|
665
|
+
array).
|
|
666
|
+
*/
|
|
667
|
+
static JSBool
|
|
668
|
+
PVGetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval)
|
|
669
|
+
{
|
|
670
|
+
char* str;
|
|
671
|
+
|
|
672
|
+
/* __PH__ array properties should be served first */
|
|
673
|
+
if(JSVAL_IS_INT(name)){
|
|
674
|
+
int32 ip;
|
|
675
|
+
|
|
676
|
+
JS_ValueToInt32(cx, name, &ip);
|
|
677
|
+
PVGetElement(cx, obj, ip, rval);
|
|
678
|
+
if(*rval!=JSVAL_VOID){
|
|
679
|
+
return JS_TRUE;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
str = JS_GetStringBytes(JS_ValueToString(cx, name));
|
|
684
|
+
|
|
685
|
+
/* __PH__ may, be */
|
|
686
|
+
if(!strcmp(str, "length")){
|
|
687
|
+
SV* sv = SvRV(PVGetRef(cx, obj));
|
|
688
|
+
|
|
689
|
+
if(SvTYPE(sv)==SVt_PVAV){
|
|
690
|
+
*rval = INT_TO_JSVAL(av_len((AV*)sv)+1);
|
|
691
|
+
return JS_TRUE;
|
|
692
|
+
}else
|
|
693
|
+
if(SvTYPE(sv)==SVt_PVHV){
|
|
694
|
+
*rval = INT_TO_JSVAL(av_len((AV*)sv)+1);
|
|
695
|
+
return JS_TRUE;
|
|
696
|
+
}else{
|
|
697
|
+
*rval = INT_TO_JSVAL(0);
|
|
698
|
+
return JS_TRUE;
|
|
699
|
+
}
|
|
700
|
+
}else{
|
|
701
|
+
int i;
|
|
702
|
+
/* __PH__ predefined methods NUST win */
|
|
703
|
+
for(i=0; i < sizeof(predefined_methods)/sizeof(char*); i++){
|
|
704
|
+
if(!strcmp(predefined_methods[i], str)){
|
|
705
|
+
return JS_TRUE;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/* __PH__ properties in hash should be served at last (possibly) */
|
|
710
|
+
PVGetKey(cx, obj, str, rval);
|
|
711
|
+
if (*rval!=JSVAL_VOID) {
|
|
712
|
+
return JS_TRUE;
|
|
713
|
+
} else {
|
|
714
|
+
#if 0
|
|
715
|
+
char* str = JS_GetStringBytes(JS_ValueToString(cx, name));
|
|
716
|
+
JS_ReportError(cx, "Perl: can't get property '%s'", str);
|
|
717
|
+
return JS_FALSE;
|
|
718
|
+
#else
|
|
719
|
+
/* when Volodya does another job, we may experiment :-) */
|
|
720
|
+
char* str = JS_GetStringBytes(JS_ValueToString(cx, name));
|
|
721
|
+
/* great, but who will dispose it? (GC of JS??) */
|
|
722
|
+
JSFunction *fun = JS_NewFunction(cx, PVCallStub, 0, 0, NULL, str);
|
|
723
|
+
*rval = OBJECT_TO_JSVAL(JS_GetFunctionObject(fun));
|
|
724
|
+
return(JS_TRUE);
|
|
725
|
+
#endif
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
return JS_TRUE;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/*
|
|
732
|
+
Set property of PerlValue object. Like GetProperty is looks at
|
|
733
|
+
both array and hash components.
|
|
734
|
+
*/
|
|
735
|
+
static JSBool
|
|
736
|
+
PVSetProperty(JSContext *cx, JSObject *obj, jsval name, jsval *rval)
|
|
737
|
+
{
|
|
738
|
+
char* str = JS_GetStringBytes(JS_ValueToString(cx, name));
|
|
739
|
+
|
|
740
|
+
if(JSVAL_IS_INT(name)){
|
|
741
|
+
int32 ip;
|
|
742
|
+
|
|
743
|
+
JS_ValueToInt32(cx, name, &ip);
|
|
744
|
+
if(PVSetElement(cx, obj, ip, *rval)) return JS_TRUE;
|
|
745
|
+
}
|
|
746
|
+
return PVSetKey(cx, obj, str, *rval);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
/*
|
|
750
|
+
Retrieve numerical property of a PerlValue object.
|
|
751
|
+
If the object doesn't contain an array, or the
|
|
752
|
+
property doesn't exist, NULL is returned.
|
|
753
|
+
*/
|
|
754
|
+
static JSBool
|
|
755
|
+
PVGetElement(JSContext *cx, JSObject *obj, jsint index, jsval *rval)
|
|
756
|
+
{
|
|
757
|
+
SV *ref, **sv;
|
|
758
|
+
AV *list;
|
|
759
|
+
|
|
760
|
+
*rval = JSVAL_VOID;
|
|
761
|
+
|
|
762
|
+
ref = PVGetRef(cx, obj);
|
|
763
|
+
|
|
764
|
+
if(SvTYPE(SvRV(ref)) != SVt_PVAV){
|
|
765
|
+
return JS_FALSE;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
list = (AV*)SvRV(ref);
|
|
769
|
+
|
|
770
|
+
if(!list){
|
|
771
|
+
return JS_FALSE;
|
|
772
|
+
}
|
|
773
|
+
sv = av_fetch(list, (I32)index, 0);
|
|
774
|
+
if(!sv){
|
|
775
|
+
return JS_FALSE;
|
|
776
|
+
}
|
|
777
|
+
//return SVToJSVAL(cx, obj, newRV_inc(*sv), rval);
|
|
778
|
+
return SVToJSVAL(cx, obj, *sv, rval);
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/*
|
|
782
|
+
Set a numeric property of a PerlValue object.
|
|
783
|
+
If the object doesn't contain an array or the
|
|
784
|
+
index doesn't exist, JS_FALSE is returned.
|
|
785
|
+
*/
|
|
786
|
+
static JSBool
|
|
787
|
+
PVSetElement(JSContext *cx, JSObject *obj, jsint index, jsval v)
|
|
788
|
+
{
|
|
789
|
+
SV *ref, **sv, *s;
|
|
790
|
+
AV *list;
|
|
791
|
+
|
|
792
|
+
ref = PVGetRef(cx, obj);
|
|
793
|
+
|
|
794
|
+
if(SvTYPE(SvRV(ref)) != SVt_PVAV){
|
|
795
|
+
return JS_FALSE;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
list = (AV*)SvRV(ref);
|
|
799
|
+
|
|
800
|
+
if(!list) return JS_FALSE;
|
|
801
|
+
JSVALToSV(cx, obj, v, &s);
|
|
802
|
+
sv = av_store(list, (I32)index, s);
|
|
803
|
+
if(!sv) return JS_FALSE;
|
|
804
|
+
return JS_TRUE;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
/*
|
|
808
|
+
Retrieve property. If the object doesn't contain an hash, or the
|
|
809
|
+
property doesn't exist, NULL is returned.
|
|
810
|
+
*/
|
|
811
|
+
static JSBool
|
|
812
|
+
PVGetKey(JSContext *cx, JSObject *obj, char* name, jsval *rval)
|
|
813
|
+
{
|
|
814
|
+
SV *ref, **sv;
|
|
815
|
+
HV *hash;
|
|
816
|
+
|
|
817
|
+
*rval = JSVAL_VOID;
|
|
818
|
+
ref = PVGetRef(cx, obj);
|
|
819
|
+
|
|
820
|
+
if(SvTYPE(SvRV(ref)) != SVt_PVHV){
|
|
821
|
+
return JS_FALSE;
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
hash = (HV*)SvRV(ref);
|
|
825
|
+
|
|
826
|
+
if(!hash){
|
|
827
|
+
return JS_FALSE;
|
|
828
|
+
}
|
|
829
|
+
sv = hv_fetch(hash, name, strlen(name), 0);
|
|
830
|
+
if(!sv){
|
|
831
|
+
return JS_FALSE;
|
|
832
|
+
}
|
|
833
|
+
return SVToJSVAL(cx, obj, newRV_inc(*sv), rval);
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
/*
|
|
837
|
+
Get property of a PerlValue object.
|
|
838
|
+
If the object doesn't contain a hash or the
|
|
839
|
+
property doesn't exist, JS_FALSE is returned.
|
|
840
|
+
*/
|
|
841
|
+
static JSBool
|
|
842
|
+
PVSetKey(JSContext *cx, JSObject *obj, char* name, jsval v)
|
|
843
|
+
{
|
|
844
|
+
SV *ref, **sv, *s;
|
|
845
|
+
HV *hash;
|
|
846
|
+
|
|
847
|
+
ref = PVGetRef(cx, obj);
|
|
848
|
+
|
|
849
|
+
if(SvTYPE(SvRV(ref)) != SVt_PVHV){
|
|
850
|
+
return JS_FALSE;
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
hash = (HV*)SvRV(ref);
|
|
854
|
+
|
|
855
|
+
if(!hash) return JS_FALSE;
|
|
856
|
+
JSVALToSV(cx, obj, v, &s);
|
|
857
|
+
sv = hv_store(hash, name, strlen(name), s, 0);
|
|
858
|
+
if(!sv) return JS_FALSE;
|
|
859
|
+
else return JS_TRUE;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
/*
|
|
863
|
+
toString() method for PerlValue. For arrays uses array's methods.
|
|
864
|
+
If this fails, the type of the value gets returned. TODO: It's actually
|
|
865
|
+
better to use a Perl module like Data::Dumpvar.pm to print complex
|
|
866
|
+
data structures recursively.
|
|
867
|
+
*/
|
|
868
|
+
static JSBool
|
|
869
|
+
PVToString(JSContext *cx, JSObject *obj, int argc, jsval *argv, jsval* rval)
|
|
870
|
+
{
|
|
871
|
+
SV* ref = PVGetRef(cx, obj);
|
|
872
|
+
SV* sv = SvRV(ref);
|
|
873
|
+
svtype type = SvTYPE(sv);
|
|
874
|
+
/*jsval args[]= {STRING_TO_JSVAL(JS_NewStringCopyZ(cx, "JS::Object::toString")),
|
|
875
|
+
OBJECT_TO_JSVAL(obj)};*/
|
|
876
|
+
jsval v;
|
|
877
|
+
/*return perl_call(cx, obj, 2, args, rval);*/
|
|
878
|
+
|
|
879
|
+
if (type==SVt_PVAV) {
|
|
880
|
+
JSObject *arrayObject = JS_NewArrayObject(cx,0,NULL);
|
|
881
|
+
JSFunction *fun;
|
|
882
|
+
|
|
883
|
+
JS_GetProperty(cx, arrayObject, "toString", &v);
|
|
884
|
+
fun = JS_ValueToFunction(cx, v);
|
|
885
|
+
return JS_CallFunction(cx, obj, fun, 0, NULL, rval);
|
|
886
|
+
}
|
|
887
|
+
{
|
|
888
|
+
char out[256];
|
|
889
|
+
JSString *newString;
|
|
890
|
+
JS_GetProperty(cx, obj, "type", &v);
|
|
891
|
+
if(!JSVAL_IS_VOID(v))
|
|
892
|
+
sprintf(out, "[%s]", JS_GetStringBytes(JSVAL_TO_STRING(v)));
|
|
893
|
+
else
|
|
894
|
+
strcpy(out, "[PerlValue]");
|
|
895
|
+
newString = JS_NewStringCopyZ(cx, out);
|
|
896
|
+
if (!newString)
|
|
897
|
+
return JS_FALSE;
|
|
898
|
+
*rval = STRING_TO_JSVAL(newString);
|
|
899
|
+
}
|
|
900
|
+
return JS_TRUE;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
static JSBool
|
|
904
|
+
PVConvert (JSContext *cx, JSObject *obj, JSType type, jsval *rval)
|
|
905
|
+
{
|
|
906
|
+
*rval = OBJECT_TO_JSVAL(obj);
|
|
907
|
+
return JS_TRUE;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
/*
|
|
911
|
+
Takes care of GC in Perl: we need to decrement Perl's
|
|
912
|
+
reference count when PV goes out of scope.
|
|
913
|
+
*/
|
|
914
|
+
|
|
915
|
+
/* #include <stdio.h> */
|
|
916
|
+
|
|
917
|
+
static void
|
|
918
|
+
PVFinalize (JSContext *cx, JSObject *obj)
|
|
919
|
+
{
|
|
920
|
+
/* SV* sv = SvRV(PVGetRef(cx, obj)); */
|
|
921
|
+
SV *sv;
|
|
922
|
+
|
|
923
|
+
if ( obj ) {
|
|
924
|
+
sv = PVGetRef(cx, obj);
|
|
925
|
+
|
|
926
|
+
/* SV *sv = PVGetRef(cx, obj);
|
|
927
|
+
if ( SvROK(sv) ) sv = SvRV( sv ); _PH_ test*/
|
|
928
|
+
|
|
929
|
+
/* TODO: GC */
|
|
930
|
+
if(sv && SvREFCNT(sv) > 0){
|
|
931
|
+
/*fprintf(stderr, "Finalization: %d references left", SvREFCNT(sv));*/
|
|
932
|
+
SvREFCNT_dec(sv);
|
|
933
|
+
/*fprintf(stderr, "Finalization: %d references left", SvREFCNT(sv));*/
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
/* return JS_TRUE; */
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/*
|
|
940
|
+
Convert a jsval to a SV* (scalar value pointer).
|
|
941
|
+
Used for parameter passing. This function is also
|
|
942
|
+
used by the Perl part of PerlConnect.
|
|
943
|
+
*/
|
|
944
|
+
|
|
945
|
+
JSBool
|
|
946
|
+
JSVALToSV(JSContext *cx, JSObject *obj, jsval v, SV** sv)
|
|
947
|
+
{
|
|
948
|
+
//*sv = &sv_undef; //__PH__??
|
|
949
|
+
if(JSVAL_IS_PRIMITIVE(v)){
|
|
950
|
+
if(JSVAL_IS_NULL(v) || JSVAL_IS_VOID(v)){
|
|
951
|
+
*sv = &PL_sv_undef;
|
|
952
|
+
//printf("===> JSVALToSV: VOID\n");
|
|
953
|
+
}else
|
|
954
|
+
if(JSVAL_IS_INT(v)){
|
|
955
|
+
*sv = sv_newmortal();
|
|
956
|
+
sv_setiv(*sv, JSVAL_TO_INT(v));
|
|
957
|
+
//*sv = newSViv(JSVAL_TO_INT(v));
|
|
958
|
+
//printf("===> JSVALToSV: INT\n");
|
|
959
|
+
}else
|
|
960
|
+
if(JSVAL_IS_DOUBLE(v)){
|
|
961
|
+
*sv = sv_newmortal();
|
|
962
|
+
sv_setnv(*sv, *JSVAL_TO_DOUBLE(v));
|
|
963
|
+
//*sv = newSVnv(*JSVAL_TO_DOUBLE(v));
|
|
964
|
+
//printf("===> JSVALToSV: DOUBLE\n");
|
|
965
|
+
}else
|
|
966
|
+
if(JSVAL_IS_STRING(v)){
|
|
967
|
+
*sv = sv_newmortal();
|
|
968
|
+
sv_setpv(*sv, JS_GetStringBytes(JSVAL_TO_STRING(v)));
|
|
969
|
+
//*sv = newSViv(0);
|
|
970
|
+
//sv_setpv(*sv, JS_GetStringBytes(JSVAL_TO_STRING(v)));
|
|
971
|
+
//printf("===> JSVALToSV: CHAR\n");
|
|
972
|
+
}else{
|
|
973
|
+
warn("Unknown primitive type");
|
|
974
|
+
}
|
|
975
|
+
}else{
|
|
976
|
+
if(JSVAL_IS_OBJECT(v)){
|
|
977
|
+
JSObject *object = JSVAL_TO_OBJECT(v);
|
|
978
|
+
if(JS_InstanceOf(cx, object, &perlValueClass, NULL)){
|
|
979
|
+
*sv = PVGetRef(cx, object);
|
|
980
|
+
}else{
|
|
981
|
+
if(JS_IsArrayObject(cx, object)){
|
|
982
|
+
*sv = sv_newmortal();
|
|
983
|
+
sv_setref_pv(*sv, "JS::Object", (void*)object);
|
|
984
|
+
sv_magic(SvRV(*sv), sv_2mortal(newSViv((IV)cx)),
|
|
985
|
+
'~', NULL, 0);
|
|
986
|
+
/* printf("===> JSVALToSV: ARRAY\n); */
|
|
987
|
+
}else{
|
|
988
|
+
*sv = sv_newmortal();
|
|
989
|
+
sv_setref_pv(*sv, "JS::Object", (void*)object);
|
|
990
|
+
sv_magic(SvRV(*sv), sv_2mortal(newSViv((IV)cx)),
|
|
991
|
+
'~', NULL, 0);
|
|
992
|
+
//printf("===> JSVALToSV: JS OBJECT\n");
|
|
993
|
+
}
|
|
994
|
+
}
|
|
995
|
+
}else{
|
|
996
|
+
warn("Type conversion is not supported");
|
|
997
|
+
*sv = &PL_sv_undef; //__PH__??
|
|
998
|
+
return JS_FALSE;
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return JS_TRUE;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
/*
|
|
1005
|
+
Converts a reference Perl value to a jsval. If ref points
|
|
1006
|
+
to an immediate value, the value itself is returned in rval.
|
|
1007
|
+
O.w. a PerlValue object is returned. This function is also
|
|
1008
|
+
used by the Perl part of PerlConnect.
|
|
1009
|
+
*/
|
|
1010
|
+
|
|
1011
|
+
#define SV_BIND_TO_OBJECT(sv) (sv_isobject(sv) || (SvROK(sv) && (\
|
|
1012
|
+
SvTYPE(SvRV(sv)) == SVt_RV ||\
|
|
1013
|
+
SvTYPE(SvRV(sv)) == SVt_PVAV ||\
|
|
1014
|
+
SvTYPE(SvRV(sv)) == SVt_PVHV ||\
|
|
1015
|
+
SvTYPE(SvRV(sv)) == SVt_PVCV\
|
|
1016
|
+
)))
|
|
1017
|
+
|
|
1018
|
+
JSBool
|
|
1019
|
+
SVToJSVAL(JSContext *cx, JSObject *obj, SV *ref, jsval *rval) {
|
|
1020
|
+
SV *sv;
|
|
1021
|
+
char* name=NULL;
|
|
1022
|
+
JSBool ok = JS_TRUE;
|
|
1023
|
+
|
|
1024
|
+
/* we'll use the dereferrenced value (excpet for object) */
|
|
1025
|
+
if( SvROK(ref) ) {
|
|
1026
|
+
sv = SvRV(ref);
|
|
1027
|
+
}else{
|
|
1028
|
+
sv = ref;
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
/* printf("+++> In SVToJSVAL value %s, type=%d\n", SvPV(sv, PL_na), SvTYPE(sv)); */
|
|
1032
|
+
|
|
1033
|
+
if ( ! SvOK( ref ) ){
|
|
1034
|
+
*rval = JSVAL_VOID;
|
|
1035
|
+
/* printf("---> SVToJSVAL returning VOID\n"); */
|
|
1036
|
+
} else
|
|
1037
|
+
if ( SV_BIND_TO_OBJECT(ref) ) {
|
|
1038
|
+
JSObject *perlValue, *prototype = NULL;
|
|
1039
|
+
JSString *nameString;
|
|
1040
|
+
|
|
1041
|
+
/*svtype type = SvTYPE(sv);
|
|
1042
|
+
switch(type){
|
|
1043
|
+
case SVt_RV: name = "Perl Reference"; break;
|
|
1044
|
+
case SVt_PVAV: name = "Perl Array"; break;
|
|
1045
|
+
case SVt_PVHV: name = "Perl Hash"; break;
|
|
1046
|
+
case SVt_PVCV: name = "Perl Code Reference"; break;
|
|
1047
|
+
case SVt_PVMG: name = "Perl Magic"; break;
|
|
1048
|
+
default:
|
|
1049
|
+
warn("Unsupported type in SVToJSVAL: %d", type);
|
|
1050
|
+
*rval = JSVAL_VOID;
|
|
1051
|
+
return JS_FALSE;
|
|
1052
|
+
}*/
|
|
1053
|
+
|
|
1054
|
+
/* printf("---> SVToJSVAL returning object\n"); */
|
|
1055
|
+
name = "Perl Value";
|
|
1056
|
+
/* __PH__ */
|
|
1057
|
+
SvREFCNT_inc(ref);
|
|
1058
|
+
|
|
1059
|
+
if (SvTYPE(sv) == SVt_PVAV) {
|
|
1060
|
+
prototype = JS_NewArrayObject(cx, 0, NULL);
|
|
1061
|
+
if (!prototype)
|
|
1062
|
+
return JS_FALSE;
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
perlValue = JS_DefineObject(cx, obj, "PerlValue",
|
|
1066
|
+
&perlValueClass, prototype,
|
|
1067
|
+
JSPROP_ENUMERATE);
|
|
1068
|
+
if (!perlValue)
|
|
1069
|
+
return JS_FALSE;
|
|
1070
|
+
JS_SetPrivate(cx, perlValue, ref);
|
|
1071
|
+
if (!JS_DefineFunctions(cx, perlValue, perlValueMethods))
|
|
1072
|
+
return JS_FALSE;
|
|
1073
|
+
if (name) {
|
|
1074
|
+
nameString = JS_NewStringCopyZ(cx, name);
|
|
1075
|
+
if (!nameString)
|
|
1076
|
+
return JS_FALSE;
|
|
1077
|
+
}
|
|
1078
|
+
if (!JS_DefineProperty(cx, perlValue, "type",
|
|
1079
|
+
name?STRING_TO_JSVAL(nameString):JSVAL_VOID,
|
|
1080
|
+
NULL, NULL, JSPROP_PERMANENT|JSPROP_READONLY))
|
|
1081
|
+
return JS_FALSE;
|
|
1082
|
+
*rval = OBJECT_TO_JSVAL(perlValue);
|
|
1083
|
+
} else
|
|
1084
|
+
if(SvIOK(sv)){
|
|
1085
|
+
*rval = INT_TO_JSVAL(SvIV(sv));
|
|
1086
|
+
/* printf("---> SVToJSVAL returning INTEGER\n"); */
|
|
1087
|
+
} else
|
|
1088
|
+
if(SvNOK(sv)){
|
|
1089
|
+
ok = JS_NewDoubleValue(cx, SvNV(sv), rval);
|
|
1090
|
+
/* printf("---> SVToJSVAL returning DOUBLE\n"); */
|
|
1091
|
+
} else
|
|
1092
|
+
if(SvPOK(sv)){
|
|
1093
|
+
*rval = STRING_TO_JSVAL((JS_NewStringCopyZ(cx, SvPV(sv, PL_na))));
|
|
1094
|
+
/* printf("---> SVToJSVAL returning CHAR\n\n"); */
|
|
1095
|
+
} else {
|
|
1096
|
+
*rval = JSVAL_VOID; /* shouldn't happen */
|
|
1097
|
+
/* printf("---> SVToJSVAL returning VOID (panic)\n"); */
|
|
1098
|
+
}
|
|
1099
|
+
return ok;
|
|
1100
|
+
}
|