wasmonkey
Version:
Write and run C code inside JavaScript file.
49 lines (42 loc) • 1.64 kB
JavaScript
const wasmCompiler = require("./wasm/wasmCompiler");
const wasmLoader = require("./wasm/wasmLoader");
const codeLexer = require("./lexer/codeLexer");
class Wasmonkey {
static #_sourceCode = `#include "emscripten.h"`;
static #_wasmLoaded = false;
static #_idTokensMap = new Map(); // key: function name, value: filename where function calls
put(codeSectionText) {
if(Wasmonkey.#_wasmLoaded)
throw new Error("Wasmonkey already loaded!");
let idLexerTokens = codeLexer.getIdLexerTokens(codeSectionText);
Wasmonkey.#_sourceCode += "\n"+codeLexer.serializeStr(
codeSectionText,
idLexerTokens,
module.parent.filename
);
for (let i = 0; i < idLexerTokens.length; i++) {
Wasmonkey.#_idTokensMap.set(idLexerTokens[i].lexeme, module.parent.filename);
}
}
load() {
if(Wasmonkey.#_wasmLoaded)
throw new Error("Wasmonkey already loaded!");
let wasmExports;
wasmCompiler.writeToExecFile(Wasmonkey.#_sourceCode.trim());
wasmCompiler.compile();
wasmExports = wasmLoader.load();
Wasmonkey.#_wasmLoaded = true;
this.#_createUserFunctions(wasmExports)
}
#_createUserFunctions(wasmExports) {
let classCtx = this;
Wasmonkey.#_idTokensMap.forEach((fileName, funcName, map) => {
classCtx[funcName] = (...args) => {
return wasmExports[
codeLexer.serializeByFilename(funcName, fileName)
](...args);
}
});
}
}
module.exports = Wasmonkey;