summaryrefslogtreecommitdiff
path: root/libraries/base/jsbits/platform.js
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/base/jsbits/platform.js')
-rw-r--r--libraries/base/jsbits/platform.js111
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