Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 05f39f5

Browse files
committed
Compress SourceMapWriter.Fragment data
We use a similar compression strategy than source maps themselves to reduce the in-memory footprint. After linking the test suite, residual memory usage is as follows: | what | main [MB] | PR [MB] | |-------------------|----------:|--------:| | sbt overall heap | 842 | 772 | | backend retained | 147 | 77 | | frontend retained | 215 | 215 |
1 parent 92d63af commit 05f39f5

File tree

2 files changed

+227
-90
lines changed

2 files changed

+227
-90
lines changed

linker/shared/src/main/scala/org/scalajs/linker/backend/BasicLinkerBackend.scala

+9-6
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,11 @@ final class BasicLinkerBackend(config: LinkerBackendImpl.Config)
4141
private[this] var totalModules = 0
4242
private[this] val rewrittenModules = new AtomicInteger(0)
4343

44+
private[this] val fragmentIndex = new SourceMapWriter.Index
45+
4446
private[this] val bodyPrinter: BodyPrinter = {
4547
if (config.minify) IdentityPostTransformerBasedBodyPrinter
46-
else if (config.sourceMap) PrintedTreeWithSourceMapBodyPrinter
48+
else if (config.sourceMap) new PrintedTreeWithSourceMapBodyPrinter(fragmentIndex)
4749
else PrintedTreeWithoutSourceMapBodyPrinter
4850
}
4951

@@ -127,7 +129,7 @@ final class BasicLinkerBackend(config: LinkerBackendImpl.Config)
127129
val sourceMapURI = OutputPatternsImpl.sourceMapURI(config.outputPatterns, moduleID.id)
128130

129131
val smWriter = new SourceMapWriter(sourceMapWriter, jsFileURI,
130-
config.relativizeSourceMapBase)
132+
config.relativizeSourceMapBase, fragmentIndex)
131133

132134
jsFileWriter.write(printedModuleSetCache.headerBytes)
133135
for (_ <- 0 until printedModuleSetCache.headerNewLineCount)
@@ -288,8 +290,8 @@ private object BasicLinkerBackend {
288290
private object PrintedTreeWithoutSourceMapBodyPrinter
289291
extends PrintedTreeBasedBodyPrinter(PostTransformerWithoutSourceMap)
290292

291-
private object PrintedTreeWithSourceMapBodyPrinter
292-
extends PrintedTreeBasedBodyPrinter(PostTransformerWithSourceMap)
293+
private class PrintedTreeWithSourceMapBodyPrinter(fragmentIndex: SourceMapWriter.Index)
294+
extends PrintedTreeBasedBodyPrinter(new PostTransformerWithSourceMap(fragmentIndex))
293295

294296
private object PostTransformerWithoutSourceMap extends Emitter.PostTransformer[js.PrintedTree] {
295297
def transformStats(trees: List[js.Tree], indent: Int): List[js.PrintedTree] = {
@@ -306,13 +308,14 @@ private object BasicLinkerBackend {
306308
}
307309
}
308310

309-
private object PostTransformerWithSourceMap extends Emitter.PostTransformer[js.PrintedTree] {
311+
private class PostTransformerWithSourceMap(fragmentIndex: SourceMapWriter.Index)
312+
extends Emitter.PostTransformer[js.PrintedTree] {
310313
def transformStats(trees: List[js.Tree], indent: Int): List[js.PrintedTree] = {
311314
if (trees.isEmpty) {
312315
Nil // Fast path
313316
} else {
314317
val jsCodeWriter = new ByteArrayWriter()
315-
val smFragmentBuilder = new SourceMapWriter.FragmentBuilder()
318+
val smFragmentBuilder = new SourceMapWriter.FragmentBuilder(fragmentIndex)
316319
val printer = new Printers.JSTreePrinterWithSourceMap(jsCodeWriter, smFragmentBuilder, indent)
317320

318321
trees.foreach(printer.printStat(_))

0 commit comments

Comments
 (0)