diff --git a/src/index.ts b/src/index.ts index a11508f..48fa3e7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,25 +1,24 @@ import { readFileSync } from 'fs' import { VM, fromValue, type Bytecode } from 'reefvm' import { Compiler } from '#compiler/compiler' -import { globals, colors } from '#prelude' +import { globals as shrimpGlobals, colors } from '#prelude' export { Compiler } from '#compiler/compiler' export { parser } from '#parser/shrimp' export { globals } from '#prelude' -export async function runFile(path: string): Promise { +export async function runFile(path: string, globals?: Record): Promise { const code = readFileSync(path, 'utf-8') - return await runCode(code) + return await runCode(code, globals) } -export async function runCode(code: string): Promise { - const compiler = new Compiler(code, Object.keys(globals)) - return await runBytecode(compiler.bytecode) +export async function runCode(code: string, globals?: Record): Promise { + return await runBytecode(compileCode(code, globals), globals) } -export async function runBytecode(bytecode: Bytecode): Promise { +export async function runBytecode(bytecode: Bytecode, globals?: Record): Promise { try { - const vm = new VM(bytecode, globals) + const vm = new VM(bytecode, Object.assign({}, shrimpGlobals, globals)) await vm.run() return vm.stack.length ? fromValue(vm.stack[vm.stack.length - 1]!) : null } catch (error: any) { @@ -28,12 +27,13 @@ export async function runBytecode(bytecode: Bytecode): Promise { } } -export function compileFile(path: string): Bytecode { +export function compileFile(path: string, globals?: Record): Bytecode { const code = readFileSync(path, 'utf-8') - return compileCode(code) + return compileCode(code, globals) } -export function compileCode(code: string): Bytecode { - const compiler = new Compiler(code, Object.keys(globals)) +export function compileCode(code: string, globals?: Record): Bytecode { + const globalNames = [...Object.keys(shrimpGlobals), ...(globals ? Object.keys(globals) : [])] + const compiler = new Compiler(code, globalNames) return compiler.bytecode } \ No newline at end of file