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