From 219c4d79dd6df6cafa27b14e831dac332bb98a0a Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Sun, 30 May 2021 14:34:50 -0700 Subject: [PATCH] Use our own callstack --- .../src/maki-interpreter/interpreter.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/webamp-modern/src/maki-interpreter/interpreter.js b/packages/webamp-modern/src/maki-interpreter/interpreter.js index 9c0bddd6..d8edabf5 100644 --- a/packages/webamp-modern/src/maki-interpreter/interpreter.js +++ b/packages/webamp-modern/src/maki-interpreter/interpreter.js @@ -14,6 +14,8 @@ function coerceTypes(var1, var2, val1 /* val2 */) { export function interpret(start, program, stack = []) { const { commands, methods, variables, classes } = program; + const callStack = []; + function popStackValue() { const v = stack.pop(); return v instanceof Variable ? v.getValue() : v; @@ -159,18 +161,17 @@ export function interpret(start, program, stack = []) { } // callGlobal case 25: { + callStack.push(ip); const offset = command.arg; - // Note: We proxy all yielded values from the child `interpret` out to - // the caller, while capturing the return value, (`value`) for use within the - // VM. - const value = interpret(offset, program, stack); - stack.push(value); + + ip = offset - 1; // -1 because we ++ after the switch break; } // return case 33: { - const aValue = popStackValue(); - return aValue; + ip = callStack.pop(); + // TODO: Stack protection? + break; } // complete case 40: {