chore(trace): dedupe filenames, not stack frames (#21160)

This commit is contained in:
Pavel Feldman 2023-02-23 09:10:09 -08:00 committed by GitHub
parent 0e93f1d511
commit b61036d22a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 17 deletions

View File

@ -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<string, number>();
const frames: StackFrame[] = [];
const stacks: [number, number[]][] = [];
const fileNames = new Map<string, number>();
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 };
}

View File

@ -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<string, StackFrame[]> {
const result = new Map<string, StackFrame[]>();
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;
}