Files
ladybird/Libraries/LibJS/Bytecode/Interpreter.cpp
Andreas Kling 690ba5299b LibJS: Pass the global object as receiver in GetGlobal
The GetGlobal bytecode optimization bypasses the normal environment
record lookup for global variable access. When a global property is
an accessor (getter), the receiver passed to the getter must be the
global object, not undefined.

The spec's Get(O, P) abstract operation is defined as O.[[Get]](P, O),
meaning the object itself is always the receiver. The global
environment's GetBindingValue delegates to its object record's
GetBindingValue, which calls Get(bindingObject, N), so the receiver
should be the binding object (the global object).

Both the cached path (calling the getter directly from get_direct)
and the non-cached path (calling internal_get) were passing
js_undefined() as the receiver. This caused strict-mode getters on
global properties to receive undefined as their this-value instead
of globalThis.

Notably, the corresponding SetGlobal paths already correctly passed
&binding_object for setter calls.
2026-02-08 20:59:20 +01:00

151 KiB