Commit graph

10 commits

Author SHA1 Message Date
Andreas Kling
c258282094 LibJS: Shrink PropertyLookupCache by putting types in its own array
We have so many inline caches that this kind of thing becomes profitable
on complex pages. Also the memory access pattern is slightly nicer for
polymorphic caches.

Reduces memory usage on my x.com home feed by 4.9 MiB.
2025-12-21 10:06:04 -06:00
Andreas Kling
138b8f9607 LibJS: Shrink PropertyLookupCache::Entry size by tweaking layout
Reorder members and use u32 instead of Optional<u32> for things that
didn't actually need the "empty" state other than for assertions.

Reduces memory usage on my x.com home feed by 9.9 MiB.
2025-12-21 10:06:04 -06:00
Andreas Kling
2a776f1d70 LibJS: Put the PropertyLookupCache's shape in a local
This avoids the extra check in Weak::operator->() a bunch of times.
2025-12-14 08:40:22 -06:00
Andreas Kling
499f0a59cf LibJS: Add variant of Object::set() that takes PropertyLookupCache
This allows us to use inline caches when setting properties in C++.
2025-12-12 11:43:35 -06:00
Andreas Kling
1dcf137d02 LibJS: Mark all throwing code paths in property access COLD and unlikely 2025-12-10 17:40:57 -06:00
Andreas Kling
7bdeb71448 Revert "LibJS: Move more of GetById/PutById unhappy paths to cold section"
This reverts commit 3e32b6ad7c.

This caused a performance regression on some Linux machines.
2025-12-10 08:52:07 -06:00
Andreas Kling
3e32b6ad7c LibJS: Move more of GetById/PutById unhappy paths to cold section
- The uncached path in GetById (will be cached if executed again)
- Any path that throws an exception
2025-12-09 21:44:13 -06:00
Luke Wilde
d4deafe5fe LibJS: Track current shape dictionary generation in PropertyLookupCache
When an object becomes too big (currently 64 properties or more), we
change its shape to a dictionary and don't do any further transitions.

However, this means the Shape of the object no longer changes, so the
cache invalidation check of `current_shape != cache.shape` is no longer
a valid check.

This fixes that by keeping track of a generation number for the Shape
both on the Shape object and in the cache, allowing that to be checked
instead of the Shape identity. The generation is incremented whenever
the dictionary is mutated.

Fixes stale cache lookups on Gmail preventing emails from being
displayed.

I was not able to produce a reproduction for this, plus the generation
count was over the 20k mark on Gmail.
2025-10-24 15:35:04 +02:00
Andreas Kling
7ee8645b9c LibJS: Avoid redundant GC::Weak checks in hot inline cache code paths
By copying out pointees to a temporary, we can avoid some redundant
pointer chasing inside GC::Weak when hitting our inline caches.
2025-10-17 17:22:16 +02:00
Andreas Kling
26c1dea22a LibJS: Move GetById logic to a separate header to prepare for reuse
We also make the code a bit more generic by making callers provide
(templated) callbacks that produce the property name and base expression
string if any.
2025-10-14 15:47:38 +02:00