1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 04:47:34 +00:00

LibJS: Ensure function declarations don't leak outside function scopes

When using VM::set_variable() to put the created ScriptFunction onto a
ScopeObject, we would previously unexpectedly reach the global object as
set_variable() checks each traversed scope for an existing Variable with
the given name - which would cause a leak of the inner function past the
outer function (we even had a test expecting that behaviour!). Now we
first declare functions (as DeclarationKind::Var) before setting them.
This will need some more work to make hoisting across non-lexical scopes
work, but it fixes this specific issue for now.

Fixes #6766.
This commit is contained in:
Linus Groh 2021-05-13 23:58:45 +01:00
parent b221cad659
commit a92dc4e30d
3 changed files with 31 additions and 10 deletions

View file

@ -0,0 +1,15 @@
test("issue #6766, nested functions should not leak to global object", () => {
function foo() {
function bar() {
function baz() {
return 42;
}
return baz();
}
return bar();
}
expect(foo()).toBe(42);
expect(globalThis.foo).toBeUndefined();
expect(globalThis.bar).toBeUndefined();
expect(globalThis.baz).toBeUndefined();
});