From b61036d22af69eea1dcd178371ce0dd1ef6b2db9 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Thu, 23 Feb 2023 09:10:09 -0800 Subject: [PATCH] chore(trace): dedupe filenames, not stack frames (#21160) --- .../playwright-core/src/utils/traceUtils.ts | 24 +++++++++---------- packages/trace/src/traceUtils.ts | 11 +++++---- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/packages/playwright-core/src/utils/traceUtils.ts b/packages/playwright-core/src/utils/traceUtils.ts index 8aea01fe8f..f009159955 100644 --- a/packages/playwright-core/src/utils/traceUtils.ts +++ b/packages/playwright-core/src/utils/traceUtils.ts @@ -14,28 +14,26 @@ * limitations under the License. */ -import type { ClientSideCallMetadata, StackFrame } from '@protocol/channels'; -import type { SerializedClientSideCallMetadata } from '@trace/traceUtils'; +import type { ClientSideCallMetadata } from '@protocol/channels'; +import type { SerializedClientSideCallMetadata, SerializedStack, SerializedStackFrame } from '@trace/traceUtils'; export function serializeClientSideCallMetadata(metadatas: ClientSideCallMetadata[]): SerializedClientSideCallMetadata { - const stackFrames = new Map(); - const frames: StackFrame[] = []; - const stacks: [number, number[]][] = []; + const fileNames = new Map(); + const stacks: SerializedStack[] = []; for (const m of metadatas) { if (!m.stack || !m.stack.length) continue; - const stack: number[] = []; + const stack: SerializedStackFrame[] = []; for (const frame of m.stack) { - const key = `${frame.file}:${frame.line || 0}:${frame.column || 0}`; - let ordinal = stackFrames.get(key); + let ordinal = fileNames.get(frame.file); if (typeof ordinal !== 'number') { - ordinal = stackFrames.size; - stackFrames.set(key, ordinal); - frames.push(frame); + ordinal = fileNames.size; + fileNames.set(frame.file, ordinal); } - stack.push(ordinal); + const stackFrame: SerializedStackFrame = [ordinal, frame.line || 0, frame.column || 0, frame.function || '']; + stack.push(stackFrame); } stacks.push([m.id, stack]); } - return { frames, stacks }; + return { files: [...fileNames.keys()], stacks }; } diff --git a/packages/trace/src/traceUtils.ts b/packages/trace/src/traceUtils.ts index f72fb6fe73..edb1e1c660 100644 --- a/packages/trace/src/traceUtils.ts +++ b/packages/trace/src/traceUtils.ts @@ -16,17 +16,20 @@ import type { StackFrame } from '@protocol/channels'; +export type SerializedStackFrame = [number, number, number, string]; +export type SerializedStack = [number, SerializedStackFrame[]]; + export type SerializedClientSideCallMetadata = { - frames: StackFrame[]; - stacks: [number, number[]][]; + files: string[]; + stacks: SerializedStack[]; }; export function parseClientSideCallMetadata(data: SerializedClientSideCallMetadata): Map { const result = new Map(); - const { frames, stacks } = data; + const { files, stacks } = data; for (const s of stacks) { const [id, ff] = s; - result.set(`call@${id}`, ff.map((f: number) => frames[f])); + result.set(`call@${id}`, ff.map(f => ({ file: files[f[0]], line: f[1], column: f[2], function: f[3] }))); } return result; }