Recompile Mono, updating MonoPlatform.ts to work with the newer version

This commit is contained in:
Steve Sanderson 2018-02-28 15:09:22 +00:00
parent 2978830a9f
commit e3b995b933
3 changed files with 33 additions and 17 deletions

View File

@ -8,8 +8,13 @@
window.Module = { window.Module = {
print: function (line) { console.log(line); }, print: function (line) { console.log(line); },
printEr: function (line) { console.error(line); }, printEr: function (line) { console.error(line); },
wasmBinaryFile: '/_framework/wasm/mono.wasm', locateFile: function (fileName) {
asmjsCodeFile: '/_framework/asmjs/mono.asm.js', switch (fileName) {
case 'mono.wasm': return '/_framework/wasm/mono.wasm';
case 'mono.asm.js': return '/_framework/asmjs/mono.asm.js';
default: return fileName;
}
},
preloadPlugins: [], preloadPlugins: [],
preRun: [function () { preRun: [function () {
preloadAssemblies(loadAssemblyUrls); preloadAssemblies(loadAssemblyUrls);
@ -33,13 +38,13 @@
var type = find_class(assembly, namespace, typeName); var type = find_class(assembly, namespace, typeName);
var method = find_method(type, methodName, -1); var method = find_method(type, methodName, -1);
var stack = Module.Runtime.stackSave(); var stack = Module.stackSave();
try { try {
var resultPtr = callMethod(method, null, args); var resultPtr = callMethod(method, null, args);
return dotnetStringToJavaScriptString(resultPtr); return dotnetStringToJavaScriptString(resultPtr);
} }
finally { finally {
Module.Runtime.stackRestore(stack); Module.stackRestore(stack);
} }
}; };
@ -94,16 +99,16 @@
} }
function callMethod(method, target, args) { function callMethod(method, target, args) {
var stack = Module.Runtime.stackSave(); var stack = Module.stackSave();
var invoke_method = Module.cwrap('mono_wasm_invoke_method', 'number', ['number', 'number', 'number']); var invoke_method = Module.cwrap('mono_wasm_invoke_method', 'number', ['number', 'number', 'number']);
try { try {
var argsBuffer = Module.Runtime.stackAlloc(args.length); var argsBuffer = Module.stackAlloc(args.length);
var exceptionFlagManagedInt = Module.Runtime.stackAlloc(4); var exceptionFlagManagedInt = Module.stackAlloc(4);
for (var i = 0; i < args.length; ++i) { for (var i = 0; i < args.length; ++i) {
var argVal = args[i]; var argVal = args[i];
if (typeof argVal === 'number') { if (typeof argVal === 'number') {
var managedInt = Module.Runtime.stackAlloc(4); var managedInt = Module.stackAlloc(4);
Module.setValue(managedInt, argVal, 'i32'); Module.setValue(managedInt, argVal, 'i32');
Module.setValue(argsBuffer + i * 4, managedInt, 'i32'); Module.setValue(argsBuffer + i * 4, managedInt, 'i32');
} else if (typeof argVal === 'string') { } else if (typeof argVal === 'string') {
@ -123,7 +128,7 @@
return res; return res;
} finally { } finally {
Module.Runtime.stackRestore(stack); Module.stackRestore(stack);
} }
} }

View File

@ -68,11 +68,11 @@ export const monoPlatform: Platform = {
throw new Error(`Currently, MonoPlatform supports passing a maximum of 4 arguments from JS to .NET. You tried to pass ${args.length}.`); throw new Error(`Currently, MonoPlatform supports passing a maximum of 4 arguments from JS to .NET. You tried to pass ${args.length}.`);
} }
const stack = Module.Runtime.stackSave(); const stack = Module.stackSave();
try { try {
const argsBuffer = Module.Runtime.stackAlloc(args.length); const argsBuffer = Module.stackAlloc(args.length);
const exceptionFlagManagedInt = Module.Runtime.stackAlloc(4); const exceptionFlagManagedInt = Module.stackAlloc(4);
for (var i = 0; i < args.length; ++i) { for (var i = 0; i < args.length; ++i) {
Module.setValue(argsBuffer + i * 4, args[i], 'i32'); Module.setValue(argsBuffer + i * 4, args[i], 'i32');
} }
@ -87,7 +87,7 @@ export const monoPlatform: Platform = {
return res; return res;
} finally { } finally {
Module.Runtime.stackRestore(stack); Module.stackRestore(stack);
} }
}, },
@ -162,15 +162,23 @@ function addScriptTagsToDocument() {
function createEmscriptenModuleInstance(loadAssemblyUrls: string[], onReady: () => void, onError: (reason?: any) => void) { function createEmscriptenModuleInstance(loadAssemblyUrls: string[], onReady: () => void, onError: (reason?: any) => void) {
const module = {} as typeof Module; const module = {} as typeof Module;
const wasmBinaryFile = '_framework/wasm/mono.wasm';
const asmjsCodeFile = '_framework/asmjs/mono.asm.js';
module.print = line => console.log(`WASM: ${line}`); module.print = line => console.log(`WASM: ${line}`);
module.printErr = line => console.error(`WASM: ${line}`); module.printErr = line => console.error(`WASM: ${line}`);
module.wasmBinaryFile = '_framework/wasm/mono.wasm';
module.asmjsCodeFile = '_framework/asmjs/mono.asm.js';
module.preRun = []; module.preRun = [];
module.postRun = []; module.postRun = [];
module.preloadPlugins = []; module.preloadPlugins = [];
module.locateFile = fileName => {
switch (fileName) {
case 'mono.wasm': return wasmBinaryFile;
case 'mono.asm.js': return asmjsCodeFile;
default: return fileName;
}
};
module.preRun.push(() => { module.preRun.push(() => {
// By now, emscripten should be initialised enough that we can capture these methods for later use // By now, emscripten should be initialised enough that we can capture these methods for later use
assembly_load = Module.cwrap('mono_wasm_assembly_load', 'number', ['string']); assembly_load = Module.cwrap('mono_wasm_assembly_load', 'number', ['string']);

View File

@ -2,13 +2,16 @@
function UTF8ToString(utf8: Mono.Utf8Ptr): string; function UTF8ToString(utf8: Mono.Utf8Ptr): string;
var preloadPlugins: any[]; var preloadPlugins: any[];
function stackSave(): Mono.StackSaveHandle;
function stackAlloc(length: number): number;
function stackRestore(handle: Mono.StackSaveHandle): void;
// These should probably be in @types/emscripten // These should probably be in @types/emscripten
var wasmBinaryFile: string;
var asmjsCodeFile: string;
function FS_createPath(parent, path, canRead, canWrite); function FS_createPath(parent, path, canRead, canWrite);
function FS_createDataFile(parent, name, data, canRead, canWrite, canOwn); function FS_createDataFile(parent, name, data, canRead, canWrite, canOwn);
} }
declare namespace Mono { declare namespace Mono {
interface Utf8Ptr { Utf8Ptr__DO_NOT_IMPLEMENT: any } interface Utf8Ptr { Utf8Ptr__DO_NOT_IMPLEMENT: any }
interface StackSaveHandle { StackSaveHandle__DO_NOT_IMPLEMENT: any }
} }