Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
470 commits
Select commit Hold shift + click to select a range
a6d5b3f
AOT: count executions for type coverage
Jarred-Sumner Oct 3, 2026
892f229
AOT: type coverage counts calls, and knows a rare branch
Jarred-Sumner Oct 3, 2026
cf122bc
AOT: constant objects
Jarred-Sumner Oct 3, 2026
dd4069d
AOT: types survive await, and prototypes of closed-world scopes
Jarred-Sumner Oct 3, 2026
b7659ac
AOT: typed arrays of unknown type, likely callees, generator frames
Jarred-Sumner Oct 3, 2026
0c6bb6a
AOT: inlined closures below a scope that is never made, return values…
Jarred-Sumner Oct 3, 2026
cad6541
AOT: remove useAOTScopeAsCallee and useAOTEnvironmentsOnStack
Jarred-Sumner Oct 3, 2026
85996cb
AOT: capture by value, saves at definitions and dead frame slots are …
Jarred-Sumner Oct 3, 2026
8226361
AOT: remove useAOTFunctionSplitting and useAOTWholeFunctionSplitting
Jarred-Sumner Oct 3, 2026
eaeb582
AOT: closures of functions whose number does not fit in a type, remov…
Jarred-Sumner Oct 3, 2026
ce441cf
AOT: count scopes that are never made by lexical position
Jarred-Sumner Oct 3, 2026
4bf4fd1
AOT: a function's name can be read while collecting
Jarred-Sumner Oct 3, 2026
413c7cc
AOT: StackVisitor does not walk to the adapter in a VM with one instance
Jarred-Sumner Oct 3, 2026
d5e7760
AOT: tools that generate programs and compare the work of two builds
Jarred-Sumner Oct 3, 2026
f9dc315
AOT: a constant index is not taken for an address
Jarred-Sumner Oct 3, 2026
fc299f0
AOT: a function that cannot be compiled fails the build
Jarred-Sumner Oct 3, 2026
7e4f367
AOT: fuzz-programs.py generates loops
Jarred-Sumner Oct 3, 2026
138f015
AOT: fuzz-programs.py generates arithmetic
Jarred-Sumner Oct 3, 2026
b0da97c
AOT: test arithmetic at the edges of int32 in loops
Jarred-Sumner Oct 3, 2026
53351da
AOT: an output builder of its own: folded constants, and guards dropp…
Jarred-Sumner Oct 3, 2026
c4b17ea
AOT: what is known about the length of typed arrays is forgotten with…
Jarred-Sumner Oct 3, 2026
5d23bb9
AOT: fuzz-programs.py generates classes
Jarred-Sumner Oct 3, 2026
8527409
AOT: remove twelve options that nothing sets
Jarred-Sumner Oct 3, 2026
4ec4351
AOT: no memory that was never written in an image
Jarred-Sumner Oct 3, 2026
ea2b24a
AOT: a call that nothing has reached yet has no result and no effects
Jarred-Sumner Oct 3, 2026
eaa6ea7
AOT: what cannot be an object cannot be called, in type inference
Jarred-Sumner Oct 3, 2026
560d360
AOT: three more steps of type inference that were not monotone
Jarred-Sumner Oct 3, 2026
6a7b0e0
AOT: order scopes by their maker, not by their address
Jarred-Sumner Oct 3, 2026
1cedad7
B3: do not create values in the order of a hash table of pointers
Jarred-Sumner Oct 3, 2026
e674b78
AOT: quote the source in errors from class field initializers
Jarred-Sumner Oct 3, 2026
6bcf989
AOT: no check for a getter when reading from super
Jarred-Sumner Oct 3, 2026
f3478e7
AOT: restore the tests of reads from super that the last commit replaced
Jarred-Sumner Oct 3, 2026
2999517
AOT: a string constant of code that runs once is not an atom
Jarred-Sumner Oct 3, 2026
b626bae
AOT: making the executable of a function does not start a collection
Jarred-Sumner Oct 3, 2026
6d2ece5
AOT: only remember integers that can be taken for addresses
Jarred-Sumner Oct 3, 2026
3624f8c
AOT: dump only one function
Jarred-Sumner Oct 3, 2026
c9a07ca
AOT: keep object literals that have a typed layout
Jarred-Sumner Oct 3, 2026
1e83a17
AOT: do not blind constants in regular expressions compiled for an image
Jarred-Sumner Oct 3, 2026
a8947ad
AOT: scalar-replace object literals that have a typed layout again
Jarred-Sumner Oct 3, 2026
ce07c57
AOT: box a number whose type has no Int32 as a double
Jarred-Sumner Oct 3, 2026
bb9f1e6
AOT: no shape for an object literal that does not fit the dispatch table
Jarred-Sumner Oct 3, 2026
d5f69d0
AOT: validate code generation against the analysis, and that inferenc…
Jarred-Sumner Oct 3, 2026
ca74836
AOT: check and convert values of typed object literals returned in re…
Jarred-Sumner Oct 3, 2026
b13dad7
B3: Jump tables in position-independent code
Jarred-Sumner Oct 4, 2026
0ade91d
AOT: Fix bugs found by comparing with DFG and FTL, add type rules and…
Jarred-Sumner Oct 4, 2026
1551491
B3: Duplicate tails in position-independent procedures
Jarred-Sumner Oct 4, 2026
b556a1c
AOT: Fix range of a loop counter on re-entry into the fast copy
Jarred-Sumner Oct 4, 2026
0a26932
AOT: Fix second batch of bugs found by auditing
Jarred-Sumner Oct 4, 2026
2b899c1
AOT: Keep caches of rarely run code filled, add operation counters
Jarred-Sumner Oct 4, 2026
5c200dd
AOT: Keep the code of functions that only construct code creates
Jarred-Sumner Oct 4, 2026
2a82a17
AOT: Fix soundness bugs, lower typed array accesses, add oracles for …
Jarred-Sumner Oct 4, 2026
2f8bb4d
AOT: Keep reachable traps at the end of functions, note callees from …
Jarred-Sumner Oct 4, 2026
18d77da
AOT: Validate typed literals that have other names, store into typed …
Jarred-Sumner Oct 4, 2026
204f9ea
AOT: Inline calls in split loops, plan construction across type check…
Jarred-Sumner Oct 4, 2026
951d841
Yarr: Share equal character classes within a pattern
Jarred-Sumner Oct 4, 2026
17008ff
AOT: Fix unpaired returns in call stubs
Jarred-Sumner Oct 4, 2026
af4d070
AOT: Stop trusting declared array types, keep type tags across handle…
Jarred-Sumner Oct 4, 2026
59ba842
AOT: Prevent overriding of built-ins, fold call / apply / bind on the…
Jarred-Sumner Oct 4, 2026
2cd1e7f
AOT: Run every run line of a test on its own in run-tests.py
Jarred-Sumner Oct 4, 2026
4ac91d4
AOT: Fix tail calls of lowered built-ins, read constants from slots, …
Jarred-Sumner Oct 4, 2026
883bb54
AOT: Do not fill a pair that the megamorphic cache has, and count mor…
Jarred-Sumner Oct 4, 2026
6acbaec
AOT: Fix two wrong folds on built-in values and an inference rule tha…
Jarred-Sumner Oct 4, 2026
a3e13d5
AOT: Faster spreads and direct stores, verify folded branches
Jarred-Sumner Oct 4, 2026
3276897
AOT: Read properties by the name recorded for a guessed slot
Jarred-Sumner Oct 4, 2026
fb2d765
AOT: Store by recorded names, guards over whole functions, fixes
Jarred-Sumner Oct 4, 2026
967800a
AOT: Fix split loops starved by name checks, add object families
Jarred-Sumner Oct 4, 2026
053953f
AOT: Find property names by hash, fix two debug-only failures
Jarred-Sumner Oct 4, 2026
d8cf5c1
AOT: Fix two miscompiles of guards over whole functions
Jarred-Sumner Oct 4, 2026
2eaa55d
AOT: Remove the checks of recorded property names
Jarred-Sumner Oct 4, 2026
33cdb5c
AOT: Fix the final graph contradicting the whole-program analysis in …
Jarred-Sumner Oct 4, 2026
23d5def
AOT: Fix a test of an argument that may be empty not narrowing in an …
Jarred-Sumner Oct 4, 2026
b6ae515
AOT: Fix the compiler aborting when a function contradicts the analys…
Jarred-Sumner Oct 4, 2026
84fd5d5
AOT: Fix a test in two steps of an argument that may be empty not nar…
Jarred-Sumner Oct 4, 2026
dc2a54d
AOT: Add an option that makes graphs contradict the analysis, for tes…
Jarred-Sumner Oct 4, 2026
c08baff
AOT: Fix validated code never checking the parameters of a function
Jarred-Sumner Oct 4, 2026
f3757ae
AOT: Fix builds with families depending on the order of compiler threads
Jarred-Sumner Oct 5, 2026
0e3a9c4
AOT: Do not check the callee's register as a parameter in validated code
Jarred-Sumner Oct 5, 2026
9edecf0
AOT: Fix a crash with useAOTTypeCoverageCounters and no aotTypeCovera…
Jarred-Sumner Oct 5, 2026
abd868b
AOT: Write the identifiers of a map file in order
Jarred-Sumner Oct 5, 2026
794fd45
AOT: Fix validated code not checking values after the last bytecode o…
Jarred-Sumner Oct 5, 2026
d6e167e
AOT: Fix type inference depending on the order of compiler threads
Jarred-Sumner Oct 5, 2026
33f6335
AOT: Enable guards over whole functions and families by default
Jarred-Sumner Oct 5, 2026
f6996af
AOT: Remove options for guards over whole functions and families
Jarred-Sumner Oct 5, 2026
4516d82
AOT: Add an option to shuffle the order of type inference for testing
Jarred-Sumner Oct 5, 2026
72dde0f
AOT: Fix type inference depending on order through its limit of passes
Jarred-Sumner Oct 5, 2026
b5be4ae
AOT: Fix cubic time of type inference on long chains of tests
Jarred-Sumner Oct 5, 2026
1ce629a
AOT: Add Structures whose fields are stable or whose shape is immutable
Jarred-Sumner Oct 5, 2026
b683570
AOT: Fix JSON.parse's reviver storing any value into a typed field
Jarred-Sumner Oct 5, 2026
ed1e2a8
Merge commit '0c06faadf65bf8e8c8ad3a5a8aca83e1e9ed653f' into claude/c…
Jarred-Sumner Oct 7, 2026
c9f02f1
[JSC] AOT: WIP: a compiler for programs translated by their static types
Jarred-Sumner Oct 8, 2026
c2bd67e
Merge remote-tracking branch 'origin/main' into claude/compile-aot
Jarred-Sumner Oct 8, 2026
0030946
[JSC] Don't build the table of all time zones for the first local Date
Jarred-Sumner Oct 10, 2026
e416019
[JSC] AOT: WIP: snapshot of the compiler for statically typed programs
Jarred-Sumner Oct 10, 2026
0db3f5e
Revert "[JSC] Don't build the table of all time zones for the first l…
Jarred-Sumner Oct 10, 2026
a537a43
wip
Jarred-Sumner Oct 12, 2026
0da0a4a
AOT: snapshot of the engine work since the last commit
Jarred-Sumner Oct 14, 2026
a4e9bfd
Merge main into compile-aot
Jarred-Sumner Oct 14, 2026
da657fe
AOT: per-realm built-in lock, dead designs removed, loader and debugg…
Jarred-Sumner Oct 14, 2026
6227115
AOT: the first design's run time removed, Windows builds, fixes
Jarred-Sumner Oct 14, 2026
afe5bf6
AOT: live bindings, huge literals as text, the lock in sloppy code, c…
Jarred-Sumner Oct 14, 2026
3cbd28f
AOT: objects born with room, fewer stack checks, smaller slow paths, …
Jarred-Sumner Oct 15, 2026
5698252
AOT: a lookup table for property access by name, async generators, sm…
Jarred-Sumner Oct 15, 2026
44cb391
Merge main into compile-aot
Jarred-Sumner Oct 16, 2026
8805107
AOT: cheaper property access by name, typed JSON parsing, loops that …
Jarred-Sumner Oct 16, 2026
7488000
AOT: plain names, smaller typed code, compiled date and number format…
Jarred-Sumner Oct 17, 2026
ed6cada
AOT: fix the Windows build, keep in-place conversions in bounds, fast…
Jarred-Sumner Oct 17, 2026
bc15181
AOT: fix the Windows ASAN build, run every marking constraint again, …
Jarred-Sumner Oct 17, 2026
0ed1d74
AOT: fix the Windows build again, faster instanceof, smaller code out…
Jarred-Sumner Oct 17, 2026
0ae359e
AOT: walk the stack on Windows x64, image stamp for Windows, shared g…
Jarred-Sumner Oct 17, 2026
f3a215c
AOT: fix the build, ship AOTTypedBuiltinLists.h with a prebuilt WebKit
Jarred-Sumner Oct 17, 2026
cb17232
AOT: a flat matcher for run-time RegExps, string buffers only where t…
Jarred-Sumner Oct 17, 2026
4008c5f
AOT: keep the caller's registers in the front end of Object.hasOwn on…
Jarred-Sumner Oct 17, 2026
a2ef284
AOT: fixes for literal unions, prototypes, instanceof and the RegExp …
Jarred-Sumner Oct 17, 2026
d2df562
AOT: fixes from CI and from real test suites
Jarred-Sumner Oct 17, 2026
a4f1b23
AOT: smaller import() functions, cheaper setPrototypeOf, iterables, f…
Jarred-Sumner Oct 17, 2026
bf1070a
AOT: the RegExp matcher never answers when it gives up, and other fixes
Jarred-Sumner Oct 17, 2026
2b9b22d
AOT: a structure's flags survive collection, JSON parsing that expect…
Jarred-Sumner Oct 17, 2026
fb07502
AOT: shorter string comparisons, module graphs kept apart, fewer trip…
Jarred-Sumner Oct 17, 2026
42c3d09
AOT: fixes for two compiler aborts, module guards are not rare code, …
Jarred-Sumner Oct 17, 2026
d70450c
AOT: blocks follow the likely path, exceptions across module graphs, …
Jarred-Sumner Oct 17, 2026
61ae3e8
AOT: fix the ASAN build, more call sites share one body
Jarred-Sumner Oct 17, 2026
30b7133
AOT: a wait for the collector uses the conn it is handed, cheaper key…
Jarred-Sumner Oct 17, 2026
f2df6d5
AOT: revert the one-table keyed store, faster Object.assign on typed …
Jarred-Sumner Oct 17, 2026
84c71e9
AOT: constant Sets and Maps as read-only tables, Object.create object…
Jarred-Sumner Oct 17, 2026
88050aa
AOT: inline site caches in Bun's per-request modules, constant Sets t…
Jarred-Sumner Oct 17, 2026
25baf35
AOT: fix converted array elements on arm64, cheaper lookups in consta…
Jarred-Sumner Oct 17, 2026
845b646
AOT: four wrong answers that depended on how hot a function is
Jarred-Sumner Oct 17, 2026
85e843a
AOT: the engine's own sort, plain objects read without converting, me…
Jarred-Sumner Oct 17, 2026
2a26607
AOT: array method chains as one loop, plain records read in place, ta…
Jarred-Sumner Oct 17, 2026
8813190
AOT: fix the Windows build, take out run-time changes that are not pa…
Jarred-Sumner Oct 17, 2026
14197ac
AOT: inline caches stay in the per-request modules, cheaper checks be…
Jarred-Sumner Oct 18, 2026
b973b21
AOT: fused String.replace is out, cheaper sorts of typed records, loc…
Jarred-Sumner Oct 18, 2026
5bb9e4b
AOT: inline caches for the hottest functions, names stored through an…
Jarred-Sumner Oct 18, 2026
e6c5d9a
AOT: a generated JSON parser that takes keys in any order, cheaper he…
Jarred-Sumner Oct 18, 2026
49220e7
AOT: the generated JSON parser never parses nested bytes twice, undec…
Jarred-Sumner Oct 18, 2026
6c16057
AOT: fix two memory-safety bugs in typed JSON, scan compressed pointe…
Jarred-Sumner Oct 18, 2026
50dd4bf
AOT: remove unused code, rename internals, run the top level of built…
Jarred-Sumner Oct 18, 2026
b4ecf32
AOT: move code out of SlotVisitor.cpp and CachedTypes.cpp, remove unu…
Jarred-Sumner Oct 18, 2026
3c35c2b
AOT: checkpoint of the rewritten compiler
Jarred-Sumner Oct 20, 2026
398e876
AOT: three days of work on the rewritten compiler
Jarred-Sumner Oct 22, 2026
58f2ff4
Merge branch 'main' into claude/compile-aot
Jarred-Sumner Oct 22, 2026
4dc2908
Merge remote-tracking branch 'origin/main' into claude/compile-aot-merge
Jarred-Sumner Oct 22, 2026
46c28b0
AOT: remove five leftover .orig files
Jarred-Sumner Oct 22, 2026
1b3ae0a
Fix the ARM64 build after the merge with main
Jarred-Sumner Oct 22, 2026
36eef3b
AOT: an hour of work on passes, the linear-scan generator, flow and t…
Jarred-Sumner Oct 22, 2026
5a4ece4
Merge branch 'claude/compile-aot-merge' into claude/compile-aot
Jarred-Sumner Oct 22, 2026
51f863c
AOT: fixes for the file-by-file build, the table of built-ins anew, s…
Jarred-Sumner Oct 22, 2026
77c819a
AOT: builds on ARM64, Android, FreeBSD, musl and Windows; a preview r…
Jarred-Sumner Oct 23, 2026
3e7c65f
AOT: macOS and Windows link again, two spaces of built-in ids, harden…
Jarred-Sumner Oct 23, 2026
7e4ea48
AOT: every file compiles alone again, jsc and testaot link without a …
Jarred-Sumner Oct 23, 2026
a893d28
AOT: the table of built-ins is compiled by the embedder, Windows link…
Jarred-Sumner Oct 23, 2026
d0e0b8c
AOT: an ASAN build keeps fastMalloc in libpas, as main does
Jarred-Sumner Oct 23, 2026
a5c3076
AOT: the table of built-ins from the engine alone, a Windows macro na…
Jarred-Sumner Oct 23, 2026
6f09279
AOT: a write-back store never stores its own base on ARM64, generated…
Jarred-Sumner Oct 23, 2026
c5ffbfe
AOT: the generated table of built-ins leaves the tree, its generator …
Jarred-Sumner Oct 23, 2026
987c35a
AOT: the include in front of sources that CMake compiles alone, a ful…
Jarred-Sumner Oct 23, 2026
c1df675
AOT: builds with assertions, musl and FreeBSD compile again; fixes, t…
Jarred-Sumner Oct 23, 2026
eda6a0d
AOT: less code: relational summaries, flattened objects, unused passe…
Jarred-Sumner Oct 23, 2026
50788cd
AOT: bring back the passes, B3 phases and RegExp text evaluation that…
Jarred-Sumner Oct 23, 2026
25f9c37
Merge main into compile-aot
Jarred-Sumner Oct 23, 2026
c31dccb
AOT: bring back three flow results that typed code depends on, with t…
Jarred-Sumner Oct 23, 2026
3e3da34
Merge branch 'claude/compile-aot-merge-1023' into claude/compile-aot
Jarred-Sumner Oct 23, 2026
5c8235f
Mark structures correctly when the marking version wraps; Object.from…
Jarred-Sumner Oct 23, 2026
d56fcd8
AOT: generated records name their own Vector; frame records on Window…
Jarred-Sumner Oct 23, 2026
caf16a9
AOT: fixes from CI and the test suites; four Air and B3 phases are up…
Jarred-Sumner Oct 23, 2026
2c3495a
AOT: fixes from fuzzing and CI; a testing switch that makes predictio…
Jarred-Sumner Oct 23, 2026
4ba5c62
AOT: the address-space budget compiles on musl; terminating a Worker …
Jarred-Sumner Oct 23, 2026
65eca57
AOT: fixes from fuzzing and from CI on ARM64 and under ASAN; a check …
Jarred-Sumner Oct 23, 2026
0248c92
AOT: fixes from fuzzing the direct code generator, whose frame slots …
Jarred-Sumner Oct 23, 2026
749216c
AOT: at most 4,096 property orders per object type
Jarred-Sumner Oct 23, 2026
2db9f2e
AOT: a shift or a sum of 32 bits is no part of a 64-bit address; a st…
Jarred-Sumner Oct 23, 2026
5c2923e
AOT: two pairs of one type are compared, for libstdc++ 13
Jarred-Sumner Oct 23, 2026
3301f7d
AOT: fixes from fuzzing, ASAN and CI; a check of finished binaries fo…
Jarred-Sumner Oct 23, 2026
6a3a747
AOT: the slow path of a lock never collects
Jarred-Sumner Oct 23, 2026
c02d721
AOT: the data of compiled code lies behind it in pages that are not e…
Jarred-Sumner Oct 23, 2026
8ec44cb
AOT: every module keeps its path again
Jarred-Sumner Oct 23, 2026
dd1c994
AOT: a switch around calls of native functions; the hardened build ke…
Jarred-Sumner Oct 23, 2026
a3251c8
AOT: a heap that stays almost full owes its error; tables without wha…
Jarred-Sumner Oct 23, 2026
91ef8f6
AOT: an executable starts through the dynamic loader; a build option …
Jarred-Sumner Oct 23, 2026
4184cc9
AOT: the directory of the FFI stubs leaves the executable pages; a ha…
Jarred-Sumner Oct 23, 2026
598707c
AOT: a locked realm keeps its arrays when a realm it depends on has a…
Jarred-Sumner Oct 23, 2026
aa17a19
AOT: a member of a literal type that nothing spells keeps its word an…
Jarred-Sumner Oct 23, 2026
12a6b5f
AOT: a dictionary with immutable properties keeps its offsets when it…
Jarred-Sumner Oct 23, 2026
63e317b
AOT: a tail call whose checked casts flow proves stays a tail call; t…
Jarred-Sumner Oct 24, 2026
b3543e7
AOT: an expected type that lists too many layouts keeps whether the v…
Jarred-Sumner Oct 24, 2026
0e1db58
AOT: a lane that has the compiler carries "-aot" in its label; JSON.p…
Jarred-Sumner Oct 24, 2026
903f4a9
AOT: a field far into a large object is read through the objects that…
Jarred-Sumner Oct 24, 2026
4639429
AOT: a validated call whose type reaches more than 256 objects is val…
Jarred-Sumner Oct 24, 2026
83068d7
AOT: the fusing of returned chains of array methods goes out again; O…
Jarred-Sumner Oct 24, 2026
0a9b77b
AOT: `key in value` asks whether the value is an object before it loo…
Jarred-Sumner Oct 24, 2026
9b86efe
B3: a load from a stack slot is not treated as immutable; AOT: the ob…
Jarred-Sumner Oct 24, 2026
9396758
Merge branch 'main'
Jarred-Sumner Oct 24, 2026
b888d84
AOT: a string made behind a merge stays where it is made when the blo…
Jarred-Sumner Oct 24, 2026
6086be4
AOT: every function goes through B3; ARM64 gets the lookup behind the…
Jarred-Sumner Oct 24, 2026
049eb4b
AOT: a cell in a frame is born by a value with an effect; claims to B…
Jarred-Sumner Oct 24, 2026
1471622
AOT: flow asks chains of lookups last; a loop's unlikely test in its …
Jarred-Sumner Oct 24, 2026
2e815be
AOT: the build without ENABLE(AOT) compiles again; ARM64 replaces an …
Jarred-Sumner Oct 24, 2026
473ad60
AOT: a definition by descriptor reads the object's method table behin…
Jarred-Sumner Oct 24, 2026
b88d649
AOT: SeparateUnlikelyLoopPaths no longer moves tests out of loop headers
Jarred-Sumner Oct 24, 2026
31c615a
AOT: operationAOTDefineOwnProperty is listed for find-structures-deco…
Jarred-Sumner Oct 24, 2026
b57ae44
AOT: an executable may hold several images, one for each entry point …
Jarred-Sumner Oct 24, 2026
f7aebcd
AOT: a build that stops says which function and pass it was in; block…
Jarred-Sumner Oct 24, 2026
40f2601
AOT: what a bound built-in does to its receiver is applied where nati…
Jarred-Sumner Oct 24, 2026
f3dbb6f
AOT: a generator's head that reads is not moved past stores; a chain …
Jarred-Sumner Oct 24, 2026
bac28d0
AOT: own accessors through the slot, long strings compared in the stu…
Jarred-Sumner Oct 24, 2026
3cf3f0d
AOT: members of a literal below Object.create, wrappers entered throu…
Jarred-Sumner Oct 24, 2026
2f4fb1f
AOT: code that the build has not seen is loaded, a function's one cal…
Jarred-Sumner Oct 24, 2026
c7250f6
AOT: a callback that call() hands on runs as often as the built-in ru…
Jarred-Sumner Oct 24, 2026
602c9e8
AOT: the class that a type names is tested for first, a function that…
Jarred-Sumner Oct 24, 2026
a6dae5c
AOT: a store of an equal string or number into a locked property succ…
Jarred-Sumner Oct 24, 2026
9e130e0
AOT: the check of words that never change reads memory outside the he…
Jarred-Sumner Oct 24, 2026
c4a81a7
AOT: the plans of a typed parse are prepared with terminations deferred
Jarred-Sumner Oct 24, 2026
4677cbd
AOT: a set of callees that is not complete proves nothing about how o…
Jarred-Sumner Oct 24, 2026
d002ce3
AOT: a loop's poll throws the RangeError that is owed at the heap's l…
Jarred-Sumner Oct 24, 2026
08cbeb6
AOT: an element stored below a String object or a typed array, what i…
Jarred-Sumner Oct 24, 2026
7119740
AOT: a dictionary's table is pinned before a stub adds to it, the sta…
Jarred-Sumner Oct 24, 2026
83eb947
AOT: captured exports are captured on demand, a failed cycle fails al…
Jarred-Sumner Oct 24, 2026
0ba9fb2
AOT: a read that finds an empty slot above a method stays typed, Comm…
Jarred-Sumner Oct 24, 2026
8fe92b9
AOT: shorter passes, flow, code generation, object model and run time…
Jarred-Sumner Oct 24, 2026
0866a5c
AOT: the tables of the flow solver's indices have a written-out defau…
Jarred-Sumner Oct 24, 2026
22c6a32
AOT: AOTTypedArrayOperations.cpp includes the types of the built-in ids
Jarred-Sumner Oct 24, 2026
a578122
AOT: a call keeps its validation whoever is called, `export *` resolv…
Jarred-Sumner Oct 24, 2026
b05f085
AOT: functions whose bytecode is written by native code, validators a…
Jarred-Sumner Oct 25, 2026
b585fbc
AOT: the release tarball includes AOTBuiltinTableEnums.h
Jarred-Sumner Oct 25, 2026
b370000
AOT: more validation nodes, a regular expression search can say it ga…
Jarred-Sumner Oct 25, 2026
9c01894
AOT: a nested literal is an object of its own, a release copies one f…
Jarred-Sumner Oct 25, 2026
41c3344
AOT: validation moves to a follow-up, no object lies inside another o…
Jarred-Sumner Oct 25, 2026
d5b3378
AOT: a Worker started from an embedded file is compiled however its p…
Jarred-Sumner Oct 25, 2026
13db273
AOT: the sort writes back with a store that may be refused, `process`…
Jarred-Sumner Oct 25, 2026
ae1234f
AOT: each call of a closure factory in a module's body gets its own c…
Jarred-Sumner Oct 25, 2026
f23d36e
AOT: heat no longer goes by shares of a small program, native functio…
Jarred-Sumner Oct 25, 2026
111fdee
AOT: what the host calls per event is hot, `subarray` is a range of a…
Jarred-Sumner Oct 25, 2026
e7631bb
AOT: listing own values refuses fields that are not enumerable or are…
Jarred-Sumner Oct 25, 2026
30bbb0b
AOT: effects say what they said before six refinements
Jarred-Sumner Oct 25, 2026
9abcacb
AOT: a loop in code that runs once is compiled like the same loop in …
Jarred-Sumner Oct 25, 2026
3b12c25
AOT: loops in code that runs once, the inliner, array capacities and …
Jarred-Sumner Oct 25, 2026
de44fec
AOT: a value is retyped when the operand it read was narrowed and the…
Jarred-Sumner Oct 25, 2026
5ec5b02
AOT: the form of a built-in that takes bounds says what its row says,…
Jarred-Sumner Oct 25, 2026
d2e6890
AOT: a cast that keeps a value's own type is not put in front of a gu…
Jarred-Sumner Oct 25, 2026
fa4810f
AOT: a store by name into any object reaches every field under its ke…
Jarred-Sumner Oct 25, 2026
b07b782
AOT: require() of a module runs the loader's jobs before it returns, …
Jarred-Sumner Oct 25, 2026
0d27a4b
AOT: the handler of null checks finds the image by the address of the…
Jarred-Sumner Oct 25, 2026
15467f1
AOT: two rules of the previous commits are out again
Jarred-Sumner Oct 25, 2026
9ba7e91
AOT: the type of a slot is what its writers test, only a module that …
Jarred-Sumner Oct 25, 2026
9e2daee
AOT: imported CommonJS files run while the graph loads, a direct call…
Jarred-Sumner Oct 25, 2026
ad82225
AOT: nothing behind a loop made of tail calls restarts in the generic…
Jarred-Sumner Oct 25, 2026
2a7a2cf
AOT: a type test leaves a loop only if what it proves lies inside the…
Jarred-Sumner Oct 25, 2026
fd9cf77
AOT: a closure that is built late keeps the declared types of its cap…
Jarred-Sumner Oct 25, 2026
742a035
AOT: `SinkAllocations` splits a list by a test of its elements as before
Jarred-Sumner Oct 25, 2026
9e2cded
AOT: a copy of a host object holds its enumerable members, a getter w…
Jarred-Sumner Oct 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
132 changes: 98 additions & 34 deletions .github/scripts/lanes.mjs

Large diffs are not rendered by default.

104 changes: 82 additions & 22 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ jobs:
# The release the lanes are published as.
tag: ${{ steps.plan.outputs.tag }}
# Matrices ({"include": [lane, ...]}) of the lanes that are only built, of the lanes that are also tested, and
# of the test job; and the labels of all lanes.
# of the test job; and the names of the release's assets: the labels of all lanes, and `SOURCES` of lanes.mjs.
build: ${{ steps.plan.outputs.build }}
build_tested: ${{ steps.plan.outputs.build_tested }}
test: ${{ steps.plan.outputs.test }}
Expand Down Expand Up @@ -248,6 +248,10 @@ jobs:
REPOSITORY: ${{ github.repository }}
IMAGE: ${{ matrix.image }}
TEST: ${{ matrix.test }}
PROGRAMS: ${{ matrix.programs }}
AOT: ${{ matrix.aot }}
DEFINES: ${{ matrix.defines }}
SOURCES: ${{ matrix.sources }}
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
TAG: ${{ needs.plan.outputs.tag }}
Expand All @@ -262,12 +266,36 @@ jobs:
node .github/scripts/lanes.mjs build "$LABEL" --output "$RUNNER_TEMP/bun-webkit" --base-image "$IMAGE"
cd "$RUNNER_TEMP"
echo "#define BUN_WEBKIT_VERSION \"$BUILD_REF\"" >> bun-webkit/include/cmakeconfig.h
# ENABLE_AOT stands on the lane's command line alone (lanes.mjs), and it changes the layout of classes in the
# headers. Whoever links these libraries and says nothing reads the headers as they were compiled here; bun
# compares BUN_WEBKIT_ENABLE_AOT with what it was told to build.
printf '#define BUN_WEBKIT_ENABLE_AOT %s\n#if !defined(ENABLE_AOT)\n#define ENABLE_AOT %s\n#endif\n' "$AOT" "$AOT" >> bun-webkit/include/cmakeconfig.h
Comment thread
claude[bot] marked this conversation as resolved.
Resolved
# So do these (`defines` in lanes.mjs).
for define in $DEFINES; do printf '#if !defined(%s)\n#define %s %s\n#endif\n' "${define%%=*}" "${define%%=*}" "${define#*=}" >> bun-webkit/include/cmakeconfig.h; done
echo "{ \"name\": \"$LABEL\", \"version\": \"0.0.1-$BUILD_REF\", \"os\": [\"$PACKAGE_OS\"], \"cpu\": [\"$PACKAGE_CPU\"], \"repository\": \"https://github.com/$REPOSITORY\" }" > bun-webkit/package.json
rm -rf bun-webkit/lib/*.so bun-webkit/lib/*.so.*
# Which programs this lane ships: `programs` in lanes.mjs.
for program in jsc testFFI testaot; do
case " $PROGRAMS " in *" $program "*) ;; *) rm -f "bun-webkit/bin/$program" "bun-webkit/bin/$program.exe" ;; esac
done
for objects in jsc-objects testaot-objects; do
case " $PROGRAMS " in *" $objects "*) ls -l bun-webkit/lib/*"$objects".* ;; *) rm -f "bun-webkit/lib/lib$objects.a" "bun-webkit/lib/$objects.lib" ;; esac
done
# For `test` alone: not part of what ships.
rm -rf test-bin && if [ -d bun-webkit/test-bin ]; then mv bun-webkit/test-bin test-bin; fi
tar -czf bun-webkit.tar.gz bun-webkit
du -sh bun-webkit/lib bun-webkit/bin/* && ls -l bun-webkit.tar.gz
# `SOURCES` in lanes.mjs: one lane packs it.
if [ -n "$SOURCES" ]; then
tar -czf "$SOURCES.tar.gz" --exclude=bun-webkit/Source/JavaScriptCore/aot/tests bun-webkit/Source/JavaScriptCore/aot
tar -tzf "$SOURCES.tar.gz" | grep -c . && ls -l "$SOURCES.tar.gz"
fi
# What `test` runs.
if [ "$TEST" = true ]; then tar -cf jsc-shell.tar bun-webkit/bin; fi
rm -rf bun-webkit
if [ "$TEST" = true ]; then
if [ -d test-bin ]; then mv test-bin/* bun-webkit/bin/; fi
tar -cf jsc-shell.tar bun-webkit/bin
fi
rm -rf bun-webkit test-bin
- name: Upload the jsc shell for the tests
if: matrix.test
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
Expand All @@ -282,15 +310,19 @@ jobs:
GH_REPO: ${{ github.repository }}
TAG: ${{ needs.plan.outputs.tag }}
LABEL: ${{ matrix.label }}
SOURCES: ${{ matrix.sources }}
DIR: ${{ runner.temp }}
run: |
set -euo pipefail
mv "$DIR/bun-webkit.tar.gz" "$DIR/$LABEL.tar.gz"
for attempt in 1 2 3 4 5; do
gh release upload "$TAG" "$DIR/$LABEL.tar.gz" --clobber && { echo "uploaded $LABEL"; exit 0; }
echo "upload of $LABEL failed (attempt $attempt)"; sleep $((attempt * 10))
for asset in "$LABEL" $SOURCES; do
uploaded=false
for attempt in 1 2 3 4 5; do
gh release upload "$TAG" "$DIR/$asset.tar.gz" --clobber && { echo "uploaded $asset"; uploaded=true; break; }
echo "upload of $asset failed (attempt $attempt)"; sleep $((attempt * 10))
done
[ "$uploaded" = true ] || exit 1
done
exit 1

build-tested:
name: ${{ matrix.label }}
Expand Down Expand Up @@ -326,7 +358,7 @@ jobs:
fail-fast: false
matrix: ${{ fromJSON(needs.plan.outputs.test) }}
# A quick lane is one tested on a runner with few cores (lanes.mjs); there is none at the moment.
timeout-minutes: ${{ matrix.quick && 300 || 90 }}
timeout-minutes: ${{ matrix.quick && 315 || 105 }}
env:
QUICK: ${{ matrix.quick }}
LABEL: ${{ matrix.label }}
Expand Down Expand Up @@ -387,7 +419,8 @@ jobs:
cd "$RUNNER_TEMP"
tar -xf jsc-shell.tar
ls -la bun-webkit/bin
# testFFI and the JavaScriptCore tests each run whatever the other did, and either failing fails the job.
# testFFI, TestWTF and the JavaScriptCore tests each run whatever the others did, and any of them failing fails
# the job.
- name: testFFI
if: &have_jsc ${{ !cancelled() && steps.download.outcome == 'success' }}
env: &test_env
Expand All @@ -402,6 +435,15 @@ jobs:
JSCTEST_memoryLimit: 4294967296
run: |
"$RUNNER_TEMP/bun-webkit/bin/testFFI"
- name: TestWTF
if: *have_jsc
env: *test_env
run: |
# Line by line: what a program that crashes still holds in its buffer is lost, and with it the name of the test.
# Not StackTraceTest: the lanes are compiled without unwind tables, so backtrace() sees one frame.
program="$RUNNER_TEMP/bun-webkit/bin/TestWTF"
if [ ! -x "$program" ]; then echo "this lane has no TestWTF"; exit 0; fi
stdbuf -oL "$program" --gtest_filter=-StackTraceTest.*
- name: run-javascriptcore-tests
if: *have_jsc
env: *test_env
Expand Down Expand Up @@ -430,13 +472,16 @@ jobs:
esac
# --quick on the small runners: see lanes.mjs.
if [ "$QUICK" = true ]; then platform+=(--quick); fi
# --root: <root>/bin/jsc. The C++ test binaries (testapi, testmasm, testb3, testair, testdfg) are not built
# by the release Dockerfiles, hence the --no-test*.
for program in testair testb3 testmasm; do [ -x "$root/bin/$program" ] || platform+=("--no-$program"); done
# A lane built with ENABLE_AOT=0 ships no testaot (`programs` in lanes.mjs).
[ -x "$root/bin/testaot" ] || platform+=(--without-aot)
# --root: <root>/bin/jsc. Of the C++ test programs a lane has testaot, and testair, testb3 and testmasm where lanes.mjs
# says so (testPrograms); the others are not built, hence the --no-test*.
# --memory-limited: what upstream's Linux bots pass; skips the tests marked as needing a lot of memory.
# --no-fail-fast: run everything, report every failure.
perl Tools/Scripts/run-javascriptcore-tests \
--no-build --root="$root" --release --jsc-only ${platform[@]+"${platform[@]}"} \
--no-testmasm --no-testair --no-testb3 --no-testdfg --no-testapi --no-testwasmdebugger --no-testlibjsctools \
--no-testdfg --no-testapi --no-testwasmdebugger --no-testlibjsctools \
--no-fail-fast --memory-limited \
--json-output="$results" 2>&1 | tee "$RUNNER_TEMP/jsc-tests.log" | awk '
# The full output (a line per test run, plus what each test prints) is jsc-tests.log in the artifact; it
Expand All @@ -458,13 +503,24 @@ jobs:
}'
status=${PIPESTATUS[0]}
echo "run-javascriptcore-tests exited with $status"
# AOTNativeTestsOfHostEntries.inc: bun's CI runs them.
left_out=$(grep -a -E '^[0-9]+ passed, [0-9]+ failed, [0-9]+ todo' "$RUNNER_TEMP/jsc-tests.log" | tail -n 1 | grep -o -E '[0-9]+ left out' || echo "0 left out")
if [ -x "$root/bin/testaot" ] && [ "$left_out" != "33 left out" ]; then echo "::error::testaot: $left_out, and 33 are expected"; status=1; fi
Comment thread
claude[bot] marked this conversation as resolved.
Resolved
# What each failing run printed (exception, stack, exit code), grouped under its name: the part of the full
# log that is needed to fix a test.
awk '
FNR == NR { if ($0 ~ /^FAIL: /) { name = $2; failing[name] = 1; order[++n] = name } next }
{ i = index($0, ": "); if (i > 0) { name = substr($0, 1, i - 1); if (name in failing) out[name] = out[name] substr($0, i + 2) "\n" } }
END { for (k = 1; k <= n; k++) { print "=== " order[k]; printf "%s\n", out[order[k]] } }
' "$RUNNER_TEMP/jsc-tests.log" "$RUNNER_TEMP/jsc-tests.log" > "$RUNNER_TEMP/jsc-failures.log" || true
# Each of testaot's failing tests once more, alone, with all that it prints.
grep -a '^FAIL ' "$RUNNER_TEMP/jsc-tests.log" | sed -E 's/^FAIL //; s/(\.ir):.*/\1/; s/: .*//' | sort -u | while read -r name; do
echo "=== testaot $name"
case "$name" in
*.ir) timeout 300 "$root/bin/testaot" run "$name" --show-output ;;
*) timeout 300 "$root/bin/testaot" native "$name" ;;
esac
done >> "$RUNNER_TEMP/jsc-failures.log" 2>&1
exit "$status"
- name: Summary
if: always()
Expand Down Expand Up @@ -501,7 +557,9 @@ jobs:
release:
name: release
# Runs whatever happened to the builds (also when the run was cancelled), so the draft never outlives the run: it
# is published when every build job succeeded and every listed asset is on it, and deleted otherwise.
# is published when every build job succeeded and every listed asset is on it. A pull request's is also published
# when lanes failed, with the lanes that were built, and the job fails: whoever tries the preview is not held up by
# a lane that they do not use. Otherwise, and when the run was cancelled, it is deleted.
if: always() && needs.plan.result == 'success'
runs-on: ubuntu-latest
timeout-minutes: 15
Expand All @@ -510,7 +568,8 @@ jobs:
- build
- build-tested
steps:
# Every lane uploads <label>.tar.gz. The lanes are the release: a label missing from it fails the job.
# Every lane uploads <label>.tar.gz, and one of them `SOURCES` of lanes.mjs too. Those are the release: one missing
# from it fails the job.
- name: Publish or delete the draft
env:
GH_TOKEN: ${{ github.token }}
Expand All @@ -523,21 +582,22 @@ jobs:
set -euo pipefail
ok=true
failed=$(jq -r 'to_entries[] | select(.value.result != "success") | "\(.key): \(.value.result)"' <<< "$NEEDS")
cancelled=$(jq -r 'to_entries[] | select(.value.result == "cancelled") | .key' <<< "$NEEDS")
if [ -n "$failed" ]; then
echo "jobs that did not succeed:"; echo "$failed"; ok=false
else
jq -r '.[]' <<< "$LABELS" | sort > expected.txt
gh api "repos/$GH_REPO/releases/$RELEASE_ID" --jq '.assets[].name' | sed 's/\.tar\.gz$//' | sort > uploaded.txt
missing=$(comm -23 expected.txt uploaded.txt)
if [ -n "$missing" ]; then
echo "assets missing from $TAG:"; echo "$missing"; ok=false
fi
fi
if [ "$ok" = true ]; then
jq -r '.[]' <<< "$LABELS" | sort > expected.txt
gh api "repos/$GH_REPO/releases/$RELEASE_ID" --jq '.assets[].name' | sed 's/\.tar\.gz$//' | sort > uploaded.txt || : > uploaded.txt
missing=$(comm -23 expected.txt uploaded.txt)
if [ -n "$missing" ]; then
echo "assets missing from $TAG:"; echo "$missing"; ok=false
fi
if [ "$ok" = true ] || { [ -n "$PR" ] && [ -z "$cancelled" ] && [ -s uploaded.txt ]; }; then
url=$(gh api -X PATCH "repos/$GH_REPO/releases/$RELEASE_ID" -F draft=false --jq .html_url)
echo "published $TAG with $(wc -l < uploaded.txt) assets: $url"
# A pull request gets a comment linking its release, edited in place by the next build.
[ -z "$PR" ] || gh pr comment "$PR" --edit-last --create-if-none --body "Preview build of ${REF:0:8}: [\`$TAG\`]($url)" || echo "::warning::could not comment on #$PR"
[ "$ok" = true ] || exit 1
exit 0
fi
# Only the draft this run created is deleted: not a published release (a re-run of a run that succeeded),
Expand Down
Loading
Loading