ladybird/Libraries/LibJS/Bytecode
Aliaksandr Kalenik 2171563daf LibJS: Avoid function envs for lexical-this arrows
Track whether a function needs environment-backed this resolution
separately from whether it needs to allocate its own function
environment. Arrow functions that only capture lexical this can now
resolve through the outer environment without allocating an empty
function environment for every call.

Keep the asm Call path conservative by routing functions that still need
lexical-this resolution through the C++ inline-call helper, so the call
receiver is not cached as the arrow function's this value.

Microbenchmark:

    function makeLexicalThisArrow() {
        return () => this.value;
    }

    let object = { value: 1, makeLexicalThisArrow };
    let fn = object.makeLexicalThisArrow();
    for (let i = 0; i < 20_000_000; ++i)
        fn();

Measured with the same Release build toggling this patch:

    baseline:  1069.2 ms mean over 12 runs
    optimized:  501.2 ms mean over 12 runs
    speedup:    2.13 times faster
2026-04-30 18:44:34 +02:00
..
AsmInterpreter LibJS: Avoid function envs for lexical-this arrows 2026-04-30 18:44:34 +02:00
BasicBlock.cpp LibJS: Stop worrying about Instruction destructors 2025-11-21 09:46:03 +01:00
BasicBlock.h LibJS: Remove remaining C++ pipeline artifacts 2026-03-19 21:55:10 -05:00
BuiltinAbstractOperationsEnabled.h LibJS: Introduce NativeJavaScriptBackedFunction 2025-11-30 11:54:54 +01:00
Builtins.h LibJS: Add a String.fromCharCode builtin opcode 2026-04-12 19:15:50 +02:00
Bytecode.def LibJS: Add a String.fromCharCode builtin opcode 2026-04-12 19:15:50 +02:00
ClassBlueprint.h LibJS: Add ClassBlueprint data structures 2026-02-11 23:57:41 +01:00
Debug.h LibJS: Move bytecode interpreter state to VM 2026-04-13 18:29:43 +02:00
Executable.cpp LibJS: Preserve source positions in bytecode source maps 2026-04-22 22:34:54 +02:00
Executable.h LibJS: Preserve source positions in bytecode source maps 2026-04-22 22:34:54 +02:00
FormatOperand.h LibJS: Improve bytecode executable dump format 2026-03-20 00:51:23 -05:00
IdentifierTable.cpp LibJS+LibWeb+WebContent: Port JS::PropertyKey to UTF-16 2025-08-05 07:07:15 -04:00
IdentifierTable.h AK: Add SentinelOptional 2026-03-20 12:03:36 +01:00
Instruction.cpp LibJS: Flatten Operand to 32-bit index in bytecode instruction stream 2025-12-09 21:44:13 -06:00
Instruction.h Meta: Reformat QtCreator file-listing script for readability 2026-02-23 13:10:03 +01:00
Interpreter.cpp LibJS: Avoid function envs for lexical-this arrows 2026-04-30 18:44:34 +02:00
Label.cpp
Label.h LibJS: Revert Enable EXPLICIT_SYMBOL_EXPORT 2025-07-22 11:51:29 -04:00
Operand.h AK: Add SentinelOptional 2026-03-20 12:03:36 +01:00
PropertyAccess.h LibJS: Remove dead C++ bytecode compilation functions 2026-03-19 21:55:10 -05:00
PropertyKeyTable.cpp LibJS: Cache fully-formed PropertyKeys in Executable 2025-12-11 14:34:45 -06:00
PropertyKeyTable.h AK: Add SentinelOptional 2026-03-20 12:03:36 +01:00
PropertyNameIterator.cpp LibJS: Cache stable for-in iteration at bytecode sites 2026-04-10 15:12:53 +02:00
PropertyNameIterator.h LibJS: Cache stable for-in iteration at bytecode sites 2026-04-10 15:12:53 +02:00
PutKind.h LibJS: Consolidate Put bytecode instructions and reduce code bloat 2026-03-04 18:53:12 +01:00
RegexTable.cpp LibRegex: Add ECMAScriptRegex and migrate callers 2026-03-27 17:32:19 +01:00
RegexTable.h LibRegex: Add ECMAScriptRegex and migrate callers 2026-03-27 17:32:19 +01:00
Register.h LibJS: Replace implicit environment stack with explicit registers 2026-02-09 16:35:39 +01:00
StringTable.cpp LibJS+LibWeb: Port interned bytecode strings to UTF-16 2025-08-14 10:27:08 +02:00
StringTable.h AK: Add SentinelOptional 2026-03-20 12:03:36 +01:00