From ee88f073e68954c502b7d6de98afa00104f06846 Mon Sep 17 00:00:00 2001 From: Jeff Lee Date: Sat, 31 Jan 2015 11:54:30 -0600 Subject: [PATCH 1/3] Add web worker environment --- Libraries/JSIL.WebWorker.Loaders.js | 13 ++++ Libraries/JSIL.WebWorker.js | 100 ++++++++++++++++++++++++++++ Libraries/JSIL.js | 26 +++++++- 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 Libraries/JSIL.WebWorker.Loaders.js create mode 100644 Libraries/JSIL.WebWorker.js diff --git a/Libraries/JSIL.WebWorker.Loaders.js b/Libraries/JSIL.WebWorker.Loaders.js new file mode 100644 index 000000000..073b214d3 --- /dev/null +++ b/Libraries/JSIL.WebWorker.Loaders.js @@ -0,0 +1,13 @@ +var assetLoaders = { + "Library": function loadLibrary (filename, data, onError, onDoneLoading, state) { + var uri = jsilConfig.libraryRoot + filename; + importScripts(uri); + }, + "Script": function loadScript (filename, data, onError, onDoneLoading, state) { + var uri = jsilConfig.scriptRoot + filename; + importScripts(uri); + }, +}; + +function initAssetLoaders () { +}; \ No newline at end of file diff --git a/Libraries/JSIL.WebWorker.js b/Libraries/JSIL.WebWorker.js new file mode 100644 index 000000000..c23b50990 --- /dev/null +++ b/Libraries/JSIL.WebWorker.js @@ -0,0 +1,100 @@ +"use strict"; + +JSIL.DeclareNamespace("JSIL.WebWorker", false); + +JSIL.WebWorker.StdOutService = function () { +}; + +JSIL.WebWorker.StdOutService.prototype.write = function (text) { + postMessage("output " + text); +}; + + +JSIL.WebWorker.StdErrService = function () { +}; + +JSIL.WebWorker.StdErrService.prototype.write = function (text) { + var trimmed = String(text).trim(); + if (trimmed[trimmed.length - 1] === "\n") { + text = trimmed.substr(0, trimmed.length - 1); + } + + postMessage("error " + text); +}; + +(function () { + JSIL.Host.registerServices({ + stdout: new JSIL.WebWorker.StdOutService(), + stderr: new JSIL.WebWorker.StdErrService() + }); +})(); + +function reportException (e) { + var stack = ""; + try { + stack = e.stack || ""; + } catch (ex) { + stack = ""; + } + + JSIL.Host.logWriteLine("// EXCEPTION:"); + JSIL.Host.logWriteLine(String(e)); + if (stack.length > 0) { + JSIL.Host.logWriteLine("// STACK:"); + JSIL.Host.logWriteLine(stack); + } + JSIL.Host.logWriteLine("// ENDEXCEPTION"); + + throw e; +}; + +function loadAssets (assets) { + for (var i = 0, l = assets.length; i < l; i++) { + var assetSpec = assets[i]; + + var assetType = assetSpec[0]; + var assetPath = assetSpec[1]; + var assetData = assetSpec[2] || null; + + var assetLoader = assetLoaders[assetType]; + + assetLoader(assetPath, assetData); + } +}; + +// onLoad will be called from the worker. +var onLoad = function () { + initAssetLoaders(); + + var seenFilenames = {}; + + var pushAsset = function (assetSpec) { + var filename = assetSpec[1]; + if (seenFilenames[filename]) + return; + + seenFilenames[filename] = true; + allAssetsToLoad.push(assetSpec); + } + + var allAssetsToLoad = []; + + if (typeof (assetsToLoad) !== "undefined") { + for (var i = 0, l = assetsToLoad.length; i < l; i++) + pushAsset(assetsToLoad[i]); + } + + if (typeof (contentManifest) === "object") { + for (var k in contentManifest) { + var subManifest = contentManifest[k]; + + for (var i = 0, l = subManifest.length; i < l; i++) + pushAsset(subManifest[i]); + + } + } + + loadAssets(allAssetsToLoad); + JSIL.Initialize(); + JSIL.Host.runInitCallbacks(); +}; \ No newline at end of file diff --git a/Libraries/JSIL.js b/Libraries/JSIL.js index e87addcaf..10f3e978e 100644 --- a/Libraries/JSIL.js +++ b/Libraries/JSIL.js @@ -140,10 +140,34 @@ var $jsilloaderstate = { this.loadScript(libraryRoot + "JSIL.Shell.Loaders.js"); }; + function Environment_WebWorker (config) { + var self = this; + this.config = config; + contentManifest["JSIL"].push(["Library", "JSIL.Storage.js"]); + contentManifest["JSIL"].push(["Library", "JSIL.IO.js"]); + contentManifest["JSIL"].push(["Library", "JSIL.XML.js"]); + }; + + Environment_WebWorker.prototype.getUserSetting = function (key) { + // FIXME + return false; + }; + + Environment_WebWorker.prototype.loadScript = function (uri) { + importScripts(uri); + }; + + Environment_WebWorker.prototype.loadEnvironmentScripts = function () { + this.loadScript(libraryRoot + "JSIL.WebWorker.js"); + this.loadScript(libraryRoot + "JSIL.WebWorker.Loaders.js"); + }; + + var environments = { "browser": Environment_Browser, - "spidermonkey_shell": Environment_SpidermonkeyShell + "spidermonkey_shell": Environment_SpidermonkeyShell, + "webworker": Environment_WebWorker } if (!config.environment) { From d0bdc4d25df863b769608fbd0bf5de0419750c4b Mon Sep 17 00:00:00 2001 From: Jeff Lee Date: Sat, 31 Jan 2015 11:54:58 -0600 Subject: [PATCH 2/3] Add missing decimal operations --- Libraries/JSIL.Bootstrap.js | 39 +++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/Libraries/JSIL.Bootstrap.js b/Libraries/JSIL.Bootstrap.js index a9ef184cb..d29cbe2a6 100644 --- a/Libraries/JSIL.Bootstrap.js +++ b/Libraries/JSIL.Bootstrap.js @@ -2041,7 +2041,16 @@ JSIL.ImplementExternals("System.Math", function ($) { return result; } ); - + + $.Method({Static:true , Public:true }, "Round", + (new JSIL.MethodSignature($jsilcore.TypeRef("System.Decimal"), [$jsilcore.TypeRef("System.Decimal"), $.Int32], [])), + function Round (value, digits) { + var multiplier = Math.pow(10, digits); + var result = Math.round(value * multiplier) / multiplier; + return result; + } + ); + $.Method({Static:true , Public:true }, "Atan2", (new JSIL.MethodSignature($.Double, [$.Double, $.Double], [])), Math.atan2 @@ -2142,6 +2151,27 @@ JSIL.MakeStruct("System.ValueType", "System.Decimal", true, [], function ($) { ctorImpl ); + $.Method({Static:true , Public:true }, "op_LessThan", + (new JSIL.MethodSignature($.Boolean, [$.Type, $.Type], [])), + function (lhs, rhs) { + return decimalToNumber(lhs) < decimalToNumber(rhs); + } + ); + + $.Method({Static:true , Public:true }, "op_LessThanOrEqual", + (new JSIL.MethodSignature($.Boolean, [$.Type, $.Type], [])), + function (lhs, rhs) { + return decimalToNumber(lhs) <= decimalToNumber(rhs); + } + ); + + $.Method({Static:true , Public:true }, "op_GreaterThan", + (new JSIL.MethodSignature($.Boolean, [$.Type, $.Type], [])), + function (lhs, rhs) { + return decimalToNumber(lhs) > decimalToNumber(rhs); + } + ); + $.Method({Static:true , Public:true }, "op_Equality", (new JSIL.MethodSignature($.Boolean, [$.Type, $.Type], [])), function (lhs, rhs) { @@ -2183,7 +2213,12 @@ JSIL.MakeStruct("System.ValueType", "System.Decimal", true, [], function ($) { return numberToDecimal(decimalToNumber(lhs) - decimalToNumber(rhs)); } ); - + + $.Method({Static:true , Public:true }, "op_Implicit", + (new JSIL.MethodSignature($.Type, [mscorlib.TypeRef("System.Int32")], [])), + numberToDecimal + ); + $.Method({Static:true , Public:true }, "op_Explicit", (new JSIL.MethodSignature($.Type, [mscorlib.TypeRef("System.Single")], [])), numberToDecimal From e482eb88459a713c651953bff969a9cf0cc92a36 Mon Sep 17 00:00:00 2001 From: Jeff Lee Date: Wed, 4 Feb 2015 10:47:29 -0600 Subject: [PATCH 3/3] Add CompareTo for enums --- Libraries/JSIL.Bootstrap.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Libraries/JSIL.Bootstrap.js b/Libraries/JSIL.Bootstrap.js index d29cbe2a6..07872e9cd 100644 --- a/Libraries/JSIL.Bootstrap.js +++ b/Libraries/JSIL.Bootstrap.js @@ -3542,6 +3542,20 @@ JSIL.ImplementExternals( return result; } ); + + $.Method({ Static: false, Public: true, Virtual: true }, "CompareTo", + new JSIL.MethodSignature($jsilcore.TypeRef("System.Int32"), [$jsilcore.TypeRef("System.Object")]), + function (enm) { + if (this.value < enm.value) { + return -1; + } + if (this.value > enm.value) { + return 1; + } + return 0; + } + ); + } );