wasmux
Version:
WebAssembly toolchain for compiling libc and kernel into system-level WASM modules
74 lines (64 loc) • 2.17 kB
JavaScript
import { WEB_KERNEL_MEMORY_ID } from './Object.mjs';
import { WEB_KERNEL_MODULE_ID } from './Object.mjs';
import { WEI_FALSE_BOOLEAN_ID } from './Object.mjs';
import { WEI_TRUE_BOOLEAN_ID } from './Object.mjs';
import { WEB_NULL_OBJECT_ID } from './Object.mjs';
import { WEB_GLOBAL_THIS_ID } from './Object.mjs';
import { WEB_SCRIPT_URL_ID } from './Object.mjs';
export class BaseThreadContext {
_objects = {};
_objectCount = 0;
_webcalls = {};
_objectCount;
_kernelModule;
_kernelMemory;
constructor(kernelModule, kernelMemory, globalThis, scriptUrl) {
this._objectCount = 0x00000100;
this._kernelModule = kernelModule;
this._kernelMemory = kernelMemory;
this._objects[WEB_KERNEL_MEMORY_ID] = kernelMemory;
this._objects[WEB_KERNEL_MODULE_ID] = kernelModule;
this._objects[3] = null;
this._objects[4] = null;
this._objects[5] = null;
this._objects[WEI_FALSE_BOOLEAN_ID] = false;
this._objects[WEI_TRUE_BOOLEAN_ID] = true;
this._objects[WEB_NULL_OBJECT_ID] = null;
this._objects[WEB_GLOBAL_THIS_ID] = globalThis;
this._objects[WEB_SCRIPT_URL_ID] = scriptUrl;
}
makeImports()
{
return {
env: {
memory: this._kernelMemory,
_math_random: Math.random,
_date_now: Date.now,
_performance_now: performance.now.bind(performance),
_webcall: (number, arg1, arg2, arg3, arg4, arg5, arg6) => this._webcalls[number].call(this, arg1, arg2, arg3, arg4, arg5, arg6),
},
};
}
getStringByMid(mid, offset, size)
{
const buffer = this._objects[mid].buffer;
const bytes = new Uint8Array(buffer, offset, size);
return String.fromCharCode.apply(String, bytes);
}
createObjectId(object)
{
const objectId = this._objectCount++;
this._objects[objectId] = object;
return objectId;
}
deleteObjectId(objectId)
{
delete this._objects[objectId];
}
perform(callback, userdata, ...args)
{
const argsIds = args.map((o) => o !== undefined ? this.createObjectId(o) : 0);
this._kernel.perform(2 + argsIds.length, callback, userdata, ...argsIds);
argsIds.forEach(i => i && this.deleteObjectId(i));
}
};