Skip to content

Commit cd3afe4

Browse files
committed
Reuse Printers in symbolToStringWorker
1 parent 1094188 commit cd3afe4

File tree

4 files changed

+41
-2
lines changed

4 files changed

+41
-2
lines changed

src/compiler/checker.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -871,6 +871,7 @@ import {
871871
pathIsRelative,
872872
PatternAmbientModule,
873873
PlusToken,
874+
pooled,
874875
PostfixUnaryExpression,
875876
PrefixUnaryExpression,
876877
PrivateIdentifier,
@@ -2173,6 +2174,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
21732174
[".json", ".json"],
21742175
];
21752176

2177+
const symbolToStringWorkerSourceFilePrinter = pooled(() => createPrinter({ removeComments: true, neverAsciiEscape: true }), (printer) => printer.reset());
2178+
const symbolToStringWorkerNonSourceFilePrinter = pooled(() => createPrinter({ removeComments: true }), (printer) => printer.reset());
2179+
21762180
initializeTypeChecker();
21772181

21782182
return checker;
@@ -6123,9 +6127,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
61236127
function symbolToStringWorker(writer: EmitTextWriter) {
61246128
const entity = builder(symbol, meaning!, enclosingDeclaration, nodeFlags)!; // TODO: GH#18217
61256129
// add neverAsciiEscape for GH#39027
6126-
const printer = enclosingDeclaration?.kind === SyntaxKind.SourceFile ? createPrinter({ removeComments: true, neverAsciiEscape: true }) : createPrinter({ removeComments: true });
6130+
const [printer, disposePrinter] = enclosingDeclaration?.kind === SyntaxKind.SourceFile
6131+
? symbolToStringWorkerSourceFilePrinter()
6132+
: symbolToStringWorkerNonSourceFilePrinter();
61276133
const sourceFile = enclosingDeclaration && getSourceFileOfNode(enclosingDeclaration);
61286134
printer.writeNode(EmitHint.Unspecified, entity, /*sourceFile*/ sourceFile, writer);
6135+
disposePrinter();
61296136
return writer;
61306137
}
61316138
}

src/compiler/core.ts

+30
Original file line numberDiff line numberDiff line change
@@ -2917,3 +2917,33 @@ export function isNodeLikeSystem(): boolean {
29172917
&& !process.browser
29182918
&& typeof module === "object";
29192919
}
2920+
2921+
/** @internal */
2922+
export function pooled<T>(fn: () => T, reset: (value: T) => void): () => [value: T, dispose: () => void] {
2923+
// TODO(jakebailey): this is supposed to be something like Go's sync.Pool,
2924+
// but I don't know of a way to "eventually" return the pool's contents to GC.
2925+
// For now, this just holds onto the objects even when they may not have been
2926+
// in use for a long time.
2927+
const pool: T[] = [];
2928+
2929+
return () => {
2930+
let value: T;
2931+
if (pool.length > 1) {
2932+
const end = pool.length - 1;
2933+
value = pool[end];
2934+
pool.length = end;
2935+
}
2936+
else {
2937+
value = fn();
2938+
}
2939+
2940+
const dispose = () => {
2941+
if (pool.length < 8) {
2942+
reset(value);
2943+
pool.push(value);
2944+
}
2945+
};
2946+
2947+
return [value, dispose];
2948+
};
2949+
}

src/compiler/emitter.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1428,7 +1428,8 @@ export function createPrinter(printerOptions: PrinterOptions = {}, handlers: Pri
14281428
writeList,
14291429
writeFile,
14301430
writeBundle,
1431-
bundleFileInfo
1431+
bundleFileInfo,
1432+
reset,
14321433
};
14331434

14341435
function printNode(hint: EmitHint, node: Node, sourceFile: SourceFile): string {

src/compiler/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9165,6 +9165,7 @@ export interface Printer {
91659165
/** @internal */ writeFile(sourceFile: SourceFile, writer: EmitTextWriter, sourceMapGenerator: SourceMapGenerator | undefined): void;
91669166
/** @internal */ writeBundle(bundle: Bundle, writer: EmitTextWriter, sourceMapGenerator: SourceMapGenerator | undefined): void;
91679167
/** @deprecated @internal */ bundleFileInfo?: BundleFileInfo;
9168+
/** @internal */ reset(): void;
91689169
}
91699170

91709171
/** @deprecated @internal */

0 commit comments

Comments
 (0)