holy moly... I was checking if I had made any perf regressions during the type inference work. this is what 🤖 found...
Root cause found — and it's neither of the things we assumed
fd59d3da pushed extract-bindings::invokeStatic from 7429 → 8685 bytecodes, across HotSpot's 8000-byte HugeMethodLimit. Methods over that limit are silently never JIT-compiled — they run interpreted for the entire lint. The method fell off the JIT cliff, and the added inference work is expensive only because it landed in a method that stopped being compiled.
Proof: with -XX:-DontCompileHugeMethods, the regression vanishes — HEAD 2320ms ≈ parent 2343 ≈ baseline 2318. It also explains why my three earlier fix attempts recovered exactly nothing: none of them shrank the method back under 8000.
The much bigger finding
That flag alone takes a metabase lint from 3828 → 2320ms (−39%), and it does so at baseline too (3657 → 2318). This is long-standing, not new. Five methods are over the limit and running interpreted:
┌──────────────────────┬───────────┬────────────────────────────────────┐
│ method │ bytecodes │ │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ lint_var_usage │ 35886 │ 4.5× the limit; #1 self-time frame │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ analyze_call │ 25857 │ #3 self-time frame │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ analyze_expression** │ 9323 │ #2 self-time frame │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ extract_bindings │ 8685 │ just over — the regression │
├──────────────────────┼───────────┼────────────────────────────────────┤
│ analyze_input │ 8239 │ │