Files
ladybird/Tests/LibJS/Bytecode/input/function-decl-source-order.js
Andreas Kling 010deec578 LibJS: Build functions_to_initialize in source order
ECMAScript hoisting keeps the LAST function declaration with a given
name. The Rust scope_collector and script GDI extraction implemented
this with a single reverse scan that pushed first-seen entries, which
left the resulting list in REVERSE source order. The C++ side then
iterated `m_functions_to_initialize.in_reverse()` to undo that.

Switch the Rust side to a two-pass forward scan that records the last
position per name and emits entries in source order, and drop the
matching `.in_reverse()` calls in Script.cpp and AbstractOperations.cpp.
Same hoisting semantics; NewFunction emission and global property
iteration order now follow the source.

The HashMap that tracks last positions is keyed on `SharedUtf16String`,
so each insert is a refcount bump on the AST's existing Rc instead of
a deep `Vec<u16>` clone.

Add bytecode tests at script and nested-function scope that exercise
multiple declarations and a duplicate name to pin the new ordering.
2026-04-27 08:04:11 +02:00

18 lines
455 B
JavaScript

// Multiple top-level function declarations should be emitted in source
// order. ECMAScript "last function with name X wins" hoisting still
// applies, so the duplicate `dup` keeps the second body.
function alpha() { return 1; }
function beta() { return 2; }
function dup() { return "first"; }
function gamma() { return 3; }
function dup() { return "second"; }
function delta() { return 4; }
console.log(alpha(), beta(), gamma(), delta(), dup());