LibJS: Clean up the anonymous wrapper block in "for" using ScopeGuard

This ensures that we don't forget to pop the wrapper off of the scope
stack when returning early due to an exception or some such. :^)
This commit is contained in:
Andreas Kling 2020-04-05 00:24:32 +02:00
parent 9ebd066ac8
commit 3c99c27db4

View file

@ -26,6 +26,7 @@
#include <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/ScopeGuard.h>
#include <AK/StringBuilder.h>
#include <LibJS/AST.h>
#include <LibJS/Interpreter.h>
@ -200,6 +201,11 @@ Value ForStatement::execute(Interpreter& interpreter) const
interpreter.enter_scope(*wrapper, {}, ScopeType::Block);
}
auto wrapper_cleanup = ScopeGuard([&] {
if (wrapper)
interpreter.exit_scope(*wrapper);
});
Value last_value = js_undefined();
if (m_init) {
@ -254,9 +260,6 @@ Value ForStatement::execute(Interpreter& interpreter) const
}
}
if (wrapper)
interpreter.exit_scope(*wrapper);
return last_value;
}