UNPKG

wasmonkey

Version:

Write and run C code inside JavaScript file.

49 lines (42 loc) 1.64 kB
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;