Skip to content

Commit edaac9f

Browse files
Refactor active flamegraph data retrieval
We were determining the selected data and applying filtering/processing inside each toggle handler, which led to inconsistencies (e.g. thread filtering) and missed cases. This approach also won’t scale well as we add more toggles. Instead, introduce a single centralized function that returns the active flamegraph data and use it consistently for all updates and processing.
1 parent 37289cb commit edaac9f

File tree

1 file changed

+35
-70
lines changed

1 file changed

+35
-70
lines changed

Lib/profiling/sampling/_flamegraph_assets/flamegraph.js

Lines changed: 35 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,36 @@ function resolveStringIndices(node, table) {
7878
return resolved;
7979
}
8080

81+
function selectFlamegraphData() {
82+
const baseData = isShowingElided ? elidedFlamegraphData : normalData;
83+
84+
if (!isInverted) {
85+
return baseData;
86+
}
87+
88+
if (isShowingElided) {
89+
if (!invertedElidedData) {
90+
invertedElidedData = generateInvertedFlamegraph(baseData);
91+
}
92+
return invertedElidedData;
93+
}
94+
95+
if (!invertedData) {
96+
invertedData = generateInvertedFlamegraph(baseData);
97+
}
98+
return invertedData;
99+
}
100+
101+
function updateFlamegraphView() {
102+
const selectedData = selectFlamegraphData();
103+
const selectedThreadId = currentThreadFilter !== 'all' ? parseInt(currentThreadFilter, 10) : null;
104+
const filteredData = selectedThreadId !== null ? filterDataByThread(selectedData, selectedThreadId) : selectedData;
105+
const tooltip = createPythonTooltip(filteredData);
106+
const chart = createFlamegraph(tooltip, filteredData.value, filteredData);
107+
renderFlamegraph(chart, filteredData);
108+
populateThreadStats(selectedData, selectedThreadId);
109+
}
110+
81111
// ============================================================================
82112
// Theme & UI Controls
83113
// ============================================================================
@@ -87,10 +117,7 @@ function toggleTheme() {
87117

88118
// Re-render flamegraph with new theme colors
89119
if (window.flamegraphData && normalData) {
90-
const currentData = isInverted ? invertedData : normalData;
91-
const tooltip = createPythonTooltip(currentData);
92-
const chart = createFlamegraph(tooltip, currentData.value, currentData);
93-
renderFlamegraph(chart, window.flamegraphData);
120+
updateFlamegraphView();
94121
}
95122
}
96123

@@ -958,7 +985,7 @@ function setupElidedToggle(data) {
958985
if (!elidedCount || !elidedFlamegraph) {
959986
return;
960987
}
961-
988+
962989
elidedFlamegraphData = resolveStringIndices(elidedFlamegraph, elidedFlamegraph.baseline_strings);
963990

964991
const toggleElided = document.getElementById('toggle-elided');
@@ -968,24 +995,7 @@ function setupElidedToggle(data) {
968995
toggleElided.onclick = function() {
969996
isShowingElided = !isShowingElided;
970997
updateToggleUI('toggle-elided', isShowingElided);
971-
972-
let dataToRender;
973-
if (isShowingElided) {
974-
if (isInverted) {
975-
if (!invertedElidedData) {
976-
invertedElidedData = generateInvertedFlamegraph(elidedFlamegraphData);
977-
}
978-
dataToRender = invertedElidedData;
979-
} else {
980-
dataToRender = elidedFlamegraphData;
981-
}
982-
} else {
983-
dataToRender = isInverted ? invertedData : normalData;
984-
}
985-
986-
const tooltip = createPythonTooltip(dataToRender);
987-
const chart = createFlamegraph(tooltip, dataToRender.value, dataToRender);
988-
renderFlamegraph(chart, dataToRender);
998+
updateFlamegraphView();
989999
};
9901000
}
9911001
}
@@ -1176,28 +1186,8 @@ function filterByThread() {
11761186

11771187
const selectedThread = threadFilter.value;
11781188
currentThreadFilter = selectedThread;
1179-
const baseData = isInverted ? invertedData : normalData;
1180-
1181-
let filteredData;
1182-
let selectedThreadId = null;
11831189

1184-
if (selectedThread === 'all') {
1185-
filteredData = baseData;
1186-
} else {
1187-
selectedThreadId = parseInt(selectedThread, 10);
1188-
filteredData = filterDataByThread(baseData, selectedThreadId);
1189-
1190-
if (filteredData.strings) {
1191-
stringTable = filteredData.strings;
1192-
filteredData = resolveStringIndices(filteredData, filteredData.strings);
1193-
}
1194-
}
1195-
1196-
const tooltip = createPythonTooltip(filteredData);
1197-
const chart = createFlamegraph(tooltip, filteredData.value, filteredData);
1198-
renderFlamegraph(chart, filteredData);
1199-
1200-
populateThreadStats(baseData, selectedThreadId);
1190+
updateFlamegraphView();
12011191
}
12021192

12031193
function filterDataByThread(data, threadId) {
@@ -1388,32 +1378,7 @@ function generateInvertedFlamegraph(data) {
13881378
function toggleInvert() {
13891379
isInverted = !isInverted;
13901380
updateToggleUI('toggle-invert', isInverted);
1391-
1392-
let dataToRender;
1393-
1394-
if (isShowingElided) {
1395-
if (isInverted) {
1396-
if (!invertedElidedData) {
1397-
invertedElidedData = generateInvertedFlamegraph(elidedFlamegraphData);
1398-
}
1399-
dataToRender = invertedElidedData;
1400-
} else {
1401-
dataToRender = elidedFlamegraphData;
1402-
}
1403-
} else {
1404-
if (isInverted && !invertedData) {
1405-
invertedData = generateInvertedFlamegraph(normalData);
1406-
}
1407-
dataToRender = isInverted ? invertedData : normalData;
1408-
1409-
if (currentThreadFilter !== 'all') {
1410-
dataToRender = filterDataByThread(dataToRender, parseInt(currentThreadFilter));
1411-
}
1412-
}
1413-
1414-
const tooltip = createPythonTooltip(dataToRender);
1415-
const chart = createFlamegraph(tooltip, dataToRender.value, dataToRender);
1416-
renderFlamegraph(chart, dataToRender);
1381+
updateFlamegraphView();
14171382
}
14181383

14191384
// ============================================================================

0 commit comments

Comments
 (0)