@marioslab/ulang-vm
Version:
Virtual machine & assembler for recreational programming like it's 1992.
309 lines • 28.8 kB
JavaScript
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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