From 672d68a73f0fe9ef89aee39a63b4f415cec2d0f6 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sat, 3 Sep 2022 09:18:41 +0100 Subject: [PATCH] Tweak --- source/interpreter.c | 48 ++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/source/interpreter.c b/source/interpreter.c index 0bb49c4..2c12e38 100644 --- a/source/interpreter.c +++ b/source/interpreter.c @@ -460,22 +460,23 @@ void initInterpreter(Interpreter* interpreter) { void freeInterpreter(Interpreter* interpreter) { //BUGFIX: handle scopes of functions, which refer to the parent scope (leaking memory) - for (int i = 0; i < interpreter->scope->variables.capacity; i++) { - //handle keys, just in case - if (IS_FUNCTION(interpreter->scope->variables.entries[i].key)) { - popScope(AS_FUNCTION(interpreter->scope->variables.entries[i].key).scope); - AS_FUNCTION(interpreter->scope->variables.entries[i].key).scope = NULL; + while(inner.scope != NULL) { + for (int i = 0; i < inner.scope->variables.capacity; i++) { + //handle keys, just in case + if (IS_FUNCTION(inner.scope->variables.entries[i].key)) { + popScope(AS_FUNCTION(inner.scope->variables.entries[i].key).scope); + AS_FUNCTION(inner.scope->variables.entries[i].key).scope = NULL; + } + + if (IS_FUNCTION(inner.scope->variables.entries[i].value)) { + popScope(AS_FUNCTION(inner.scope->variables.entries[i].value).scope); + AS_FUNCTION(inner.scope->variables.entries[i].value).scope = NULL; + } } - if (IS_FUNCTION(interpreter->scope->variables.entries[i].value)) { - popScope(AS_FUNCTION(interpreter->scope->variables.entries[i].value).scope); - AS_FUNCTION(interpreter->scope->variables.entries[i].value).scope = NULL; - } + inner.scope = popScope(inner.scope); } - popScope(interpreter->scope); - interpreter->scope = NULL; - freeLiteralArray(&interpreter->literalCache); freeLiteralArray(&interpreter->stack); } @@ -1516,23 +1517,26 @@ static bool execFnCall(Interpreter* interpreter) { //free //BUGFIX: handle scopes of functions, which refer to the parent scope (leaking memory) - for (int i = 0; i < inner.scope->variables.capacity; i++) { - //handle keys, just in case - if (IS_FUNCTION(inner.scope->variables.entries[i].key)) { - popScope(AS_FUNCTION(inner.scope->variables.entries[i].key).scope); - AS_FUNCTION(inner.scope->variables.entries[i].key).scope = NULL; + while(inner.scope != AS_FUNCTION(func).scope) { + for (int i = 0; i < inner.scope->variables.capacity; i++) { + //handle keys, just in case + if (IS_FUNCTION(inner.scope->variables.entries[i].key)) { + popScope(AS_FUNCTION(inner.scope->variables.entries[i].key).scope); + AS_FUNCTION(inner.scope->variables.entries[i].key).scope = NULL; + } + + if (IS_FUNCTION(inner.scope->variables.entries[i].value)) { + popScope(AS_FUNCTION(inner.scope->variables.entries[i].value).scope); + AS_FUNCTION(inner.scope->variables.entries[i].value).scope = NULL; + } } - if (IS_FUNCTION(inner.scope->variables.entries[i].value)) { - popScope(AS_FUNCTION(inner.scope->variables.entries[i].value).scope); - AS_FUNCTION(inner.scope->variables.entries[i].value).scope = NULL; - } + inner.scope = popScope(inner.scope); } freeLiteralArray(&returns); freeLiteralArray(&arguments); freeLiteralArray(&inner.stack); freeLiteralArray(&inner.literalCache); - popScope(inner.scope); freeLiteral(func); //actual bytecode persists until next call