From a14d97d8e19620a832ec497ca6d0bd8d7809a0d9 Mon Sep 17 00:00:00 2001 From: Ilya Ryzhenkov Date: Wed, 2 Sep 2015 17:57:05 +0300 Subject: [PATCH] Optimize line mapping initialization. --- .../jetbrains/kotlin/codegen/inline/SMAP.kt | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt index 332050d2a2d..4fe4d407eb1 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt @@ -16,16 +16,13 @@ package org.jetbrains.kotlin.codegen.inline -import com.intellij.openapi.application.ApplicationManager -import org.jetbrains.org.objectweb.asm.MethodVisitor -import org.jetbrains.org.objectweb.asm.Label -import java.util -import java.util.LinkedHashMap -import java.util.Collections -import java.util.ArrayList -import org.jetbrains.kotlin.codegen.SourceInfo +import gnu.trove.TIntIntHashMap import org.jetbrains.kotlin.codegen.ClassBuilder -import kotlin.properties.Delegates +import org.jetbrains.kotlin.codegen.SourceInfo +import org.jetbrains.org.objectweb.asm.Label +import org.jetbrains.org.objectweb.asm.MethodVisitor +import java.util +import java.util.* //TODO join parameter public class SMAPBuilder(val source: String, @@ -194,23 +191,24 @@ public open class DefaultSourceMapper(val sourceInfo: SourceInfo, override val p var fileMappings: LinkedHashMap = linkedMapOf() - protected var origin: RawFileMapping by Delegates.notNull() + protected val origin: RawFileMapping init { - visitSource(sourceInfo.source, sourceInfo.pathOrCleanFQN) - //map interval - (1..maxUsedValue).forEach {origin.mapLine(it, it - 1, true) } + val name = sourceInfo.source + val path = sourceInfo.pathOrCleanFQN + origin = RawFileMapping(name, path) + origin.initRange(1, maxUsedValue) + fileMappings.put(createKey(name, path), origin) + lastVisited = origin } + private fun createKey(name: String, path: String) = "$name#$path" + override val resultMappings: List get() = fileMappings.values().map { it.toFileMapping() } override fun visitSource(name: String, path: String) { - lastVisited = fileMappings.getOrPut("$name#$path", { RawFileMapping(name, path) }) - //TEMPORARY HACK - if (fileMappings.size() == 1) { - origin = lastVisited!! - } + lastVisited = fileMappings.getOrPut(createKey(name, path), { RawFileMapping(name, path) }) } override fun visitOrigin() { @@ -264,7 +262,7 @@ class SMAP(val fileMappings: List) { } class RawFileMapping(val name: String, val path: String) { - private val lineMappings = linkedMapOf() + private val lineMappings = TIntIntHashMap() private val rangeMappings = arrayListOf() private var lastMappedWithNewIndex = -1000; @@ -277,14 +275,23 @@ class RawFileMapping(val name: String, val path: String) { return fileMapping } + fun initRange(start: Int, end: Int) { + assert(lineMappings.isEmpty(), "initRange should only be called for empty mapping") + for (index in start..end) { + lineMappings.put(index, index) + } + rangeMappings.add(RangeMapping(start, start, end - start + 1)) + lastMappedWithNewIndex = end + } + fun mapLine(source: Int, currentIndex: Int, isLastMapped: Boolean): Int { var dest = lineMappings[source] - if (dest == null) { + if (dest == 0) { // line numbers are 1-based, so 0 is ok to indicate missing value val rangeMapping: RangeMapping if (rangeMappings.isNotEmpty() && isLastMapped && couldFoldInRange(lastMappedWithNewIndex, source)) { rangeMapping = rangeMappings.last() rangeMapping.range += source - lastMappedWithNewIndex - dest = lineMappings[lastMappedWithNewIndex]!! + source - lastMappedWithNewIndex + dest = lineMappings[lastMappedWithNewIndex] + source - lastMappedWithNewIndex } else { dest = currentIndex + 1