diff options
Diffstat (limited to 'libraries/base/jsbits/platform.js')
-rw-r--r-- | libraries/base/jsbits/platform.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/libraries/base/jsbits/platform.js b/libraries/base/jsbits/platform.js new file mode 100644 index 0000000000..2ecdee2189 --- /dev/null +++ b/libraries/base/jsbits/platform.js @@ -0,0 +1,111 @@ +//#OPTIONS: CPP + +/* platform-specific setup */ + +/* + if browser mode is active (GHCJS_BROWSER is defined), all the runtime platform + detection code should be removed by the preprocessor. The h$isPlatform variables + are undeclared. + + in non-browser mode, use h$isNode, h$isJsShell, h$isBrowser to find the current + platform. + + more platforms should be added here in the future +*/ +#ifndef GHCJS_BROWSER +var h$isNode_ = false; // runtime is node.js +var h$isJvm_ = false; // runtime is JVM +var h$isJsShell_ = false; // runtime is SpiderMonkey jsshell +var h$isJsCore_ = false; // runtime is JavaScriptCore jsc +var h$isBrowser_ = false; // running in browser or everything else + +var h$isGHCJSi_ = false; // Code is GHCJSi (browser or node) + +function h$isNode() { + return h$isNode_; +} + +function h$isJvm() { + return h$isJvm_; +} + +function h$isJsShell() { + return h$isJsShell_; +} + +function h$isJsCore() { + return h$isJsCore_; +} + +function h$isBrowser() { + return h$isBrowser_; +} + +function h$isGHCJSi() { + return h$isGHCJSi_; +} + +// load all required node.js modules +if(typeof process !== 'undefined' && (typeof h$TH !== 'undefined' || (typeof require !== 'undefined' && typeof module !== 'undefined' && module.exports))) { + h$isNode_ = true; + // we have to use these names for the closure compiler externs to work + var fs = require('fs'); + var path = require('path'); + var os = require('os'); + var child_process = require('child_process'); + var h$fs = fs; + var h$path = path; + var h$os = os; + var h$child = child_process; + var h$process = process; + function h$getProcessConstants() { + // this is a non-public API, but we need these values for things like file access modes + var cs = process['binding']('constants'); + if(typeof cs.os === 'object' && typeof cs.fs === 'object') { + return cs; + } else { + // earlier node.js versions (4.x and older) have all constants directly in the constants object + // construct something that resembles the hierarchy of the object in new versions: + return { 'fs': cs + , 'crypto': cs + , 'os': { 'UV_UDP_REUSEADDR': cs['UV_UDP_REUSEADDR'] + , 'errno': cs + , 'signals': cs + } + }; + } + } + var h$processConstants = h$getProcessConstants(); +} else if(typeof Java !== 'undefined') { + h$isJvm_ = true; + this.console = { + log: function(s) { + java.lang.System.out.print(s); + } + }; +} else if(typeof snarf !== 'undefined' && typeof print !== 'undefined' && typeof quit !== 'undefined') { + h$isJsShell_ = true; + this.console = { log: this.print }; +} else if(typeof numberOfDFGCompiles !== 'undefined' && typeof jscStack !== 'undefined') { + h$isJsCore_ = true; +} else { + h$isBrowser_ = true; +} +if(typeof global !== 'undefined' && global.h$GHCJSi) { + h$isGHCJSi_ = true; +} +#endif + +function h$getGlobal(that) { + if(typeof global !== 'undefined') return global; + return that; +} + +#ifdef GHCJS_BROWSER +// IE 8 doesn't support Date.now(), shim it +if (!Date.now) { + Date.now = function now() { + return +(new Date); + }; +} +#endif |