UNPKG

@marioslab/ulang-vm

Version:

Virtual machine & assembler for recreational programming like it's 1992.

309 lines 28.8 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import loadWasm from "./ulang"; let module = { onRuntimeInitialized: createWrappers }; export function loadUlang() { return __awaiter(this, void 0, void 0, function* () { return yield loadWasm(module); }); } let ulang_calloc; let ulang_free; let ulang_print_memory; let ulang_file_from_memory; let ulang_file_free; let ulang_error_print; let ulang_error_free; let ulang_compile; let ulang_program_free; let ulang_vm_init; let ulang_vm_step; let ulang_vm_step_n; let ulang_vm_step_n_bp; let ulang_vm_print; let ulang_vm_pop_int; let ulang_vm_pop_uint; let ulang_vm_pop_float; let ulang_vm_push_int; let ulang_vm_push_uint; let ulang_vm_push_float; let ulang_vm_free; let ulang_sizeof; let ulang_print_offsets; let ulang_argb_to_rgba; export let getInt8 = (ptr) => new DataView(module.HEAPU8.buffer).getInt8(ptr); export let getInt16 = (ptr) => new DataView(module.HEAPU8.buffer).getInt16(ptr, true); export let getUint32 = (ptr) => new DataView(module.HEAPU8.buffer).getUint32(ptr, true); export let setUint32 = (ptr, val) => new DataView(module.HEAPU8.buffer).setUint32(ptr, val, true); export let getInt32 = (ptr) => new DataView(module.HEAPU8.buffer).getInt32(ptr, true); export let getFloat32 = (ptr) => new DataView(module.HEAPU8.buffer).getFloat32(ptr, true); export let argbToRgba; export let addFunction; export let UTF8ArrayToString; ; export let HEAPU8; export function createWrappers() { ulang_calloc = module.cwrap("ulang_calloc", "ptr", ["number"]); ulang_free = module.cwrap("ulang_free", "void", ["ptr"]); ulang_print_memory = module.cwrap("ulang_print_memory", "void", []); ulang_file_from_memory = module.cwrap("ulang_file_from_memory", "number", ["ptr", "ptr", "ptr"]); ulang_file_free = module.cwrap("ulang_file_free", "void", ["ptr"]); ulang_error_print = module.cwrap("ulang_error_print", "void", ["ptr"]); ulang_error_free = module.cwrap("ulang_error_free", "void", ["ptr"]); ulang_compile = module.cwrap("ulang_compile", "number", ["ptr", "ptr", "ptr"]); ulang_program_free = module.cwrap("ulang_program_free", "void", ["ptr"]); ulang_vm_init = module.cwrap("ulang_vm_init", "void", ["ptr", "ptr"]); ulang_vm_step = module.cwrap("ulang_vm_step", "number", ["ptr"]); ulang_vm_step_n = module.cwrap("ulang_vm_step_n", "number", ["ptr", "number"]); ulang_vm_step_n_bp = module.cwrap("ulang_vm_step_n_bp", "number", ["ptr", "number", "ptr", "number"]); ulang_vm_print = module.cwrap("ulang_vm_print", "void", ["ptr"]); ulang_vm_pop_int = module.cwrap("ulang_vm_pop_int", "number", ["ptr"]); ulang_vm_pop_uint = module.cwrap("ulang_vm_pop_uint", "number", ["ptr"]); ulang_vm_pop_float = module.cwrap("ulang_vm_pop_float", "number", ["ptr"]); ulang_vm_push_int = module.cwrap("ulang_vm_push_int", "void", ["ptr", "number"]); ulang_vm_push_uint = module.cwrap("ulang_vm_push_uint", "void", ["ptr", "number"]); ulang_vm_push_float = module.cwrap("ulang_vm_push_float", "void", ["ptr", "number"]); ulang_vm_free = module.cwrap("ulang_vm_free", "void", ["ptr"]); ulang_sizeof = module.cwrap("ulang_sizeof", "number", ["number"]); ulang_print_offsets = module.cwrap("ulang_print_offsets", "void", []); argbToRgba = ulang_argb_to_rgba = module.cwrap("ulang_argb_to_rgba", "ptr", ["ptr", "ptr", "number"]); addFunction = module.addFunction; UTF8ArrayToString = module.UTF8ArrayToString; HEAPU8 = () => module.HEAP8; } export function ptrToUlangString(stringPtr) { return { ptr: stringPtr, data: () => getUint32(stringPtr), length: () => getUint32(stringPtr + 4), toString: () => module.UTF8ArrayToString(module.HEAPU8, getUint32(stringPtr), getUint32(stringPtr + 4)) }; } export function ptrToUlangSpan(spanPtr) { return { ptr: spanPtr, data: () => ptrToUlangString(spanPtr), startLine: () => getUint32(spanPtr + 8), endLine: () => getUint32(spanPtr + 12) }; } export function ptrToUlangLine(linePtr) { return { ptr: linePtr, data: () => ptrToUlangString(linePtr), lineNumber: () => getUint32(linePtr + 8) }; } export function ptrToUlangFile(filePtr) { return { ptr: filePtr, fileName: () => ptrToUlangString(filePtr), data: () => ptrToUlangString(filePtr + 8), lines: () => { let lines = []; let linesPtr = getUint32(filePtr + 16); let numLines = getUint32(filePtr + 20); for (let i = 0; i < numLines + 1; i++) { lines.push(ptrToUlangLine(linesPtr)); linesPtr += 12; } return lines; }, free: () => { ulang_file_free(filePtr); ulang_free(filePtr); } }; } export function ptrToUlangError(errorPtr) { return { ptr: errorPtr, file: () => ptrToUlangFile(getUint32(errorPtr)), span: () => ptrToUlangSpan(errorPtr + 4), message: () => ptrToUlangString(errorPtr + 20), isSet: () => getInt32(errorPtr + 28) != 0, print: () => ulang_error_print(errorPtr), free: () => { ulang_error_free(errorPtr); ulang_free(errorPtr); } }; } export var UlangLabelTarget; (function (UlangLabelTarget) { UlangLabelTarget[UlangLabelTarget["UL_LT_UNINITIALIZED"] = 0] = "UL_LT_UNINITIALIZED"; UlangLabelTarget[UlangLabelTarget["UL_LT_CODE"] = 1] = "UL_LT_CODE"; UlangLabelTarget[UlangLabelTarget["UL_LT_DATA"] = 2] = "UL_LT_DATA"; UlangLabelTarget[UlangLabelTarget["UL_LT_RESERVED_DATA"] = 3] = "UL_LT_RESERVED_DATA"; })(UlangLabelTarget || (UlangLabelTarget = {})); export function ptrToUlangLabel(labelPtr) { return { ptr: labelPtr, label: () => ptrToUlangSpan(labelPtr), target: () => getUint32(labelPtr + 16), address: () => getUint32(labelPtr + 20) }; } export var UlangValueType; (function (UlangValueType) { UlangValueType[UlangValueType["UL_INTEGER"] = 0] = "UL_INTEGER"; UlangValueType[UlangValueType["UL_FLOAT"] = 1] = "UL_FLOAT"; })(UlangValueType || (UlangValueType = {})); export function ptrToUlangConstant(labelPtr) { return { ptr: labelPtr, type: () => getUint32(labelPtr), name: () => ptrToUlangSpan(labelPtr + 4), i: () => getUint32(labelPtr + 20), f: () => getUint32(labelPtr + 20) }; } export function ptrToUlangProgram(progPtr) { return { ptr: progPtr, code: () => new DataView(module.HEAPU8.buffer, getUint32(progPtr), getUint32(progPtr + 4)), data: () => new DataView(module.HEAPU8.buffer, getUint32(progPtr + 8), getUint32(progPtr + 12)), reservedBytes: () => getUint32(progPtr + 16), labels: () => { let labels = []; let labelsPtr = getUint32(progPtr + 20); let labelsLength = getUint32(progPtr + 24); for (let i = 0; i < labelsLength; i++) { labels.push(ptrToUlangLabel(labelsPtr)); labelsPtr += 24; } return labels; }, constants: () => { let constants = []; let constantsPtr = getUint32(progPtr + 28); let constantsLength = getUint32(progPtr + 32); for (let i = 0; i < constantsLength; i++) { constants.push(ptrToUlangLabel(constantsPtr)); constantsPtr += 24; } return constants; }, file: () => { return ptrToUlangFile(progPtr + 36); }, addressToLine: () => { let addressToLine = []; let addressToLinePtr = getUint32(progPtr + 40); let addressToLineLength = getUint32(progPtr + 44); for (let i = 0; i < addressToLineLength; i++) { addressToLine.push(getUint32(addressToLinePtr)); addressToLinePtr += 4; } return addressToLine; }, free: () => { ulang_program_free(progPtr); ulang_free(progPtr); } }; } export function ptrToUlangValue(valPtr) { return { ptr: valPtr, b: () => getInt8(valPtr), s: () => getInt16(valPtr), i: () => getInt32(valPtr), ui: () => getUint32(valPtr), f: () => getFloat32(valPtr) }; } export function ptrToUlangVm(vmPtr) { return { ptr: vmPtr, registers: () => { let regs = []; let regsPtr = vmPtr; for (let i = 0; i < 16; i++) { regs.push(ptrToUlangValue(regsPtr)); regsPtr += 4; } return regs; }, memory: () => new DataView(module.HEAPU8, getUint32(vmPtr + 64), getUint32(vmPtr + 68)), memoryPtr: () => getUint32(vmPtr + 64), error: () => ptrToUlangError(getUint32(vmPtr + 1096)), program: () => ptrToUlangProgram(getUint32(vmPtr + 1128)), setSyscall: (num, call) => { if (num < 0 || num > 255) return; setUint32(vmPtr + 72 + num * 4, call); }, step: () => ulang_vm_step(vmPtr) != 0, stepN: (n) => ulang_vm_step_n(vmPtr, n) != 0, stepNBP: (n, bpPtr, numBp) => ulang_vm_step_n_bp(vmPtr, n, bpPtr, numBp), print: () => ulang_vm_print(vmPtr), popInt: () => ulang_vm_pop_int(vmPtr), popUint: () => ulang_vm_pop_uint(vmPtr), popFloat: () => ulang_vm_pop_float(vmPtr), pushInt: (val) => ulang_vm_push_int(vmPtr, val), pushUint: (val) => ulang_vm_push_uint(vmPtr, val), pushFloat: (val) => ulang_vm_push_float(vmPtr, val), free: () => { ulang_vm_free(vmPtr); ulang_free(vmPtr); } }; } var UlangType; (function (UlangType) { UlangType[UlangType["UL_TYPE_FILE"] = 0] = "UL_TYPE_FILE"; UlangType[UlangType["UL_TYPE_ERROR"] = 1] = "UL_TYPE_ERROR"; UlangType[UlangType["UL_TYPE_PROGRAM"] = 2] = "UL_TYPE_PROGRAM"; UlangType[UlangType["UL_TYPE_VM"] = 3] = "UL_TYPE_VM"; })(UlangType || (UlangType = {})); export function alloc(numBytes) { return ulang_calloc(numBytes); } export function allocType(type) { return ulang_calloc(ulang_sizeof(type)); } ; export function free(ptr) { return ulang_free(ptr); } export function printMemory() { ulang_print_memory(); } export function newFile(sourceName, sourceData) { let name = module.allocateUTF8(sourceName); let data = module.allocateUTF8(sourceData); let filePtr = allocType(UlangType.UL_TYPE_FILE); ulang_file_from_memory(name, data, filePtr); module._free(name); module._free(data); return ptrToUlangFile(filePtr); } export function newError() { return ptrToUlangError(allocType(UlangType.UL_TYPE_ERROR)); } export function newProgram() { return ptrToUlangProgram(allocType(UlangType.UL_TYPE_PROGRAM)); } export function compile(source) { let error = newError(); let file = newFile("source", source); let program = newProgram(); let result = { error: error, file: file, program: program, free: () => { program.free(); file.free(); error.free(); }, }; ulang_compile(result.file.ptr, result.program.ptr, result.error.ptr); return result; } ; export function newVm(program) { let vm = ptrToUlangVm(allocType(UlangType.UL_TYPE_VM)); ulang_vm_init(vm.ptr, program.ptr); return vm; } export const UL_VM_MEMORY_SIZE = (1024 * 1024 * 32); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93cmFwcGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sUUFBUSxNQUFNLFNBQVMsQ0FBQTtBQUU5QixJQUFJLE1BQU0sR0FBRztJQUNaLG9CQUFvQixFQUFFLGNBQWM7Q0FDN0IsQ0FBQztBQUVULE1BQU0sVUFBZ0IsU0FBUzs7UUFDOUIsT0FBTyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQUE7QUFFRCxJQUFJLFlBQTBDLENBQUM7QUFDL0MsSUFBSSxVQUFpQyxDQUFDO0FBQ3RDLElBQUksa0JBQThCLENBQUM7QUFDbkMsSUFBSSxzQkFBcUYsQ0FBQztBQUMxRixJQUFJLGVBQTBDLENBQUM7QUFDL0MsSUFBSSxpQkFBNkMsQ0FBQztBQUNsRCxJQUFJLGdCQUE0QyxDQUFDO0FBQ2pELElBQUksYUFBZ0YsQ0FBQztBQUNyRixJQUFJLGtCQUFnRCxDQUFDO0FBQ3JELElBQUksYUFBMEQsQ0FBQztBQUMvRCxJQUFJLGFBQXdDLENBQUM7QUFDN0MsSUFBSSxlQUFxRCxDQUFDO0FBQzFELElBQUksa0JBQXNGLENBQUM7QUFDM0YsSUFBSSxjQUF1QyxDQUFDO0FBQzVDLElBQUksZ0JBQTJDLENBQUM7QUFDaEQsSUFBSSxpQkFBNEMsQ0FBQztBQUNqRCxJQUFJLGtCQUE2QyxDQUFDO0FBQ2xELElBQUksaUJBQXVELENBQUM7QUFDNUQsSUFBSSxrQkFBd0QsQ0FBQztBQUM3RCxJQUFJLG1CQUF5RCxDQUFDO0FBQzlELElBQUksYUFBc0MsQ0FBQztBQUMzQyxJQUFJLFlBQXNDLENBQUM7QUFDM0MsSUFBSSxtQkFBK0IsQ0FBQztBQUNwQyxJQUFJLGtCQUF5RSxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdEYsTUFBTSxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDOUYsTUFBTSxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEcsTUFBTSxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRyxNQUFNLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5RixNQUFNLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsRyxNQUFNLENBQUMsSUFBSSxVQUFtRSxDQUFDO0FBQy9FLE1BQU0sQ0FBQyxJQUFJLFdBQXNELENBQUM7QUFDbEUsTUFBTSxDQUFDLElBQUksaUJBQTRELENBQUM7QUFBQSxDQUFDO0FBQ3pFLE1BQU0sQ0FBQyxJQUFJ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