Repository navigation
Conversation
mstange
force-pushed
the
function-list
branch
from
December 1, 2024 04:42
48f5a60 to
c8c16b9
Compare
mstange
force-pushed
the
function-list
branch
from
February 1, 2025 17:43
c8c16b9 to
4d44cf7
Compare
mstange
force-pushed
the
function-list
branch
4 times, most recently
from
April 2, 2026 18:48
25bc285 to
af75e01
Compare
mstange
force-pushed
the
function-list
branch
2 times, most recently
from
April 7, 2026 18:28
26f8559 to
abde12b
Compare
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #5233 +/- ##
==========================================
- Coverage 84.78% 84.46% -0.33%
==========================================
Files 358 367 +9
Lines 38946 40603 +1657
Branches 11019 11260 +241
==========================================
+ Hits 33022 34294 +1272
- Misses 5488 5869 +381
- Partials 436 440 +4 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
mstange
force-pushed
the
function-list
branch
5 times, most recently
from
June 24, 2026 20:53
86bf68a to
5059e16
Compare
mstange
force-pushed
the
function-list
branch
2 times, most recently
from
July 3, 2026 19:08
50bbdd4 to
2667660
Compare
mstange
force-pushed
the
function-list
branch
2 times, most recently
from
September 3, 2026 20:22
55c94a0 to
7b7cea8
Compare
mstange
force-pushed
the
function-list
branch
2 times, most recently
from
September 23, 2026 19:53
b76a337 to
253a2d1
Compare
mstange
force-pushed
the
function-list
branch
from
October 14, 2026 22:53
253a2d1 to
de01733
Compare
This was referenced Oct 19, 2026
…ming. The Canvas computed the tooltip percentage itself, by subtracting the box's start from its end. That only works because the non-inverted flame graph happens to lay boxes out relative to rootTotalSummary. Move the computation behind a getRatioOfRootTotalSummary() method on FlameGraphTiming so that each implementation can decide how its box widths relate to the percentage it wants to display.
The flame graph currently derives box widths from rootTotalSummary, which also serves as the 100% reference for the displayed percentages. The upcoming function list wings need those to differ: a wing's root should fill the full width, while percentages should stay relative to all filtered samples. Add a separate flameGraphWidthTotal to CallTreeTimings for the width reference. It equals rootTotalSummary everywhere so far, so nothing changes yet.
mstange
force-pushed
the
function-list
branch
from
October 27, 2026 19:40
e7a508f to
4554986
Compare
Netlify reuses a cached checkout in which husky has set core.hooksPath. Its 'preparing repo' stage runs git checkout before node is installed, so the post-checkout hook failed with exit code 127 and aborted the deploy preview.
Add a new "Function List" tab which shows a flat, sortable list of functions rather than a tree. Selection is per-function instead of per-call-node, so this adds a per-thread selected function to the URL state, along with the URL handling, reducers and selectors that go with it. Selecting a function replaces the current history entry instead of pushing a new one. Otherwise, holding the down arrow key in the list would flood the back/forward history and get rate-limited by the browser.
The call tree's context menu operates on a call node path, which the function list does not have. Add a sibling menu that operates on a function index instead. The menu items are described by a data table rather than repeated JSX, because the same set of transforms is about to be reused by more than one view.
These are the same single-key shortcuts the call tree context menu offers (m, f, S, c, C, r, R, d), applied to the selected function.
When the function list tab is active, the activity graph should highlight every sample whose stack contains the selected function, rather than the samples belonging to a selected call node.
Clicking a sample already selects the corresponding self call node. When the function list tab is active, also select that call node's function so the click has an effect there too.
Turn CallNodeInfoInverted from a concrete class into an interface, and rename the existing class to LazyInvertedCallNodeInfo. Along with that, stop assuming that an inverted tree has exactly one root per function: the timings are now keyed by root call node handle, obtained via getRootNodeForFunc(), rather than by func index directly. For the lazy implementation the two are still the same number, so this is behavior-preserving. This makes room for an inverted CallNodeInfo whose roots are restricted to a single function, which the next commit adds.
The lower wing answers "who calls the selected function?". It is an inverted tree, but unlike the regular inverted tree it has a single root — the selected function — and its totals count only the samples in which that function appears. LowerWingCallNodeInfo builds that tree eagerly from the selected function's root-most entry points, expanding by inverted depth as the view asks for it. computeLowerWingTimings maps each entry point's inclusive time onto the corresponding node so that the percentages stay relative to the full thread.
The upper wing answers "what does the selected function call?". It is a non-inverted tree rooted at the selected function, built by re-rooting the thread's stacks at that function's entry points.
Lay out the lower wing as a flame graph. Because the lower wing tree is materialized lazily by inverted depth, the layout is computed row by row and memoizes its prefix sums rather than walking a fully built table.
…Inverted. ThreadViewOptions stored the selected and expanded call node paths in four separate fields, one pair for the non-inverted tree and one pair for the inverted tree. Replace them with two records keyed by a CallNodeArea, and pass the area in the CHANGE_SELECTED_CALL_NODE, CHANGE_EXPANDED_CALL_NODES and CHANGE_RIGHT_CLICKED_CALL_NODE actions instead of an isInverted boolean. This doesn't change behavior. It makes it possible to add more areas, each with its own selected, expanded and right-clicked call node path.
The function list is about to grow "wings" around the selected function: descendants (upper) and ancestors (lower). Each needs its own selected, expanded and right-clicked call node path, so add LOWER_WING and UPPER_WING call node areas next to the two tree areas. The wings are rooted at the selected function. Mirror the selected function into the wing paths whenever it changes, both from the function list and from URL state, so that initial loads and back/forward navigation restore the wings to the right function. This commit adds the state, actions, reducers and call tree selectors; the views that consume them follow.
A collapsible section with a header, used by the function list wings in the next commit. The header can hold extra controls via headerActions.
Render the descendants and ancestors wings next to the function list, each in its own disclosure box. Both are the same TreeView-based component, differing only in which selectors they read and which context menu they open. Whether each disclosure box is open is persisted in the URL. The function list context menu is now shared between the function list and the wings, so rename it to WingContextMenu and give it a second connected variant for the lower wing, whose right-clicked target is a call node rather than a bare function.
The upper and lower wings can now be displayed either as a call tree or as a flame graph, and WingViewToggle in the disclosure box header switches between them. The choice is per-wing and persisted in the URL.
The self wing shows where the selected function spends its own self time. It is built from the focusSelf-filtered thread, taken before the implementation filter so that native frames inside a JS function's self time stay visible when the filter is set to "JS only". Like the other wings, it has its own disclosure box and can be displayed as a call tree or as a flame graph. The function list context menu now also checks the self wing's call node table for recursion, because the focusSelf filter can reveal recursion that the regular call node table hides.
mstange
force-pushed
the
function-list
branch
from
October 27, 2026 20:07
4554986 to
46d1082
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Deploy preview
WIP implementing the approach outlined in #15 (comment)