Added additional strata for stacktraces
This commit is contained in:
@@ -86,7 +86,8 @@ public abstract class MemberCodegen<T extends KtElement/* TODO: & JetDeclaration
|
|||||||
protected ExpressionCodegen clInit;
|
protected ExpressionCodegen clInit;
|
||||||
private NameGenerator inlineNameGenerator;
|
private NameGenerator inlineNameGenerator;
|
||||||
|
|
||||||
private SourceMapper sourceMapper;
|
private DefaultSourceMapper sourceMapper;
|
||||||
|
|
||||||
private final ConstantExpressionEvaluator constantExpressionEvaluator;
|
private final ConstantExpressionEvaluator constantExpressionEvaluator;
|
||||||
|
|
||||||
public MemberCodegen(
|
public MemberCodegen(
|
||||||
@@ -557,7 +558,7 @@ public abstract class MemberCodegen<T extends KtElement/* TODO: & JetDeclaration
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public SourceMapper getOrCreateSourceMapper() {
|
public DefaultSourceMapper getOrCreateSourceMapper() {
|
||||||
if (sourceMapper == null) {
|
if (sourceMapper == null) {
|
||||||
sourceMapper = new DefaultSourceMapper(SourceInfo.Companion.createInfo(element, getClassName()));
|
sourceMapper = new DefaultSourceMapper(SourceInfo.Companion.createInfo(element, getClassName()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.builtins.BuiltInsPackageFragment;
|
|||||||
import org.jetbrains.kotlin.codegen.*;
|
import org.jetbrains.kotlin.codegen.*;
|
||||||
import org.jetbrains.kotlin.codegen.context.*;
|
import org.jetbrains.kotlin.codegen.context.*;
|
||||||
import org.jetbrains.kotlin.codegen.inline2.*;
|
import org.jetbrains.kotlin.codegen.inline2.*;
|
||||||
|
import org.jetbrains.kotlin.codegen.inline2.DefaultSourceMapper;
|
||||||
import org.jetbrains.kotlin.codegen.inline2.NestedSourceMapper;
|
import org.jetbrains.kotlin.codegen.inline2.NestedSourceMapper;
|
||||||
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicArrayConstructorsKt;
|
import org.jetbrains.kotlin.codegen.intrinsics.IntrinsicArrayConstructorsKt;
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
@@ -352,6 +353,8 @@ public class InlineCodegen extends CallGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private InlineResult inlineCall(SMAPAndMethodNode nodeAndSmap) {
|
private InlineResult inlineCall(SMAPAndMethodNode nodeAndSmap) {
|
||||||
|
DefaultSourceMapper defaultSourceMapper = codegen.getParentCodegen().getOrCreateSourceMapper();
|
||||||
|
defaultSourceMapper.setCallSiteMarker(new CallSiteMarker(codegen.getLastLineNumber()));
|
||||||
MethodNode node = nodeAndSmap.getNode();
|
MethodNode node = nodeAndSmap.getNode();
|
||||||
ReifiedTypeParametersUsages reificationResult = reifiedTypeInliner.reifyInstructions(node);
|
ReifiedTypeParametersUsages reificationResult = reifiedTypeInliner.reifyInstructions(node);
|
||||||
generateClosuresBodies();
|
generateClosuresBodies();
|
||||||
@@ -402,6 +405,8 @@ public class InlineCodegen extends CallGenerator {
|
|||||||
|
|
||||||
addInlineMarker(codegen.v, false);
|
addInlineMarker(codegen.v, false);
|
||||||
|
|
||||||
|
defaultSourceMapper.setCallSiteMarker(null);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen.inline
|
|||||||
import gnu.trove.TIntIntHashMap
|
import gnu.trove.TIntIntHashMap
|
||||||
import org.jetbrains.kotlin.codegen.ClassBuilder
|
import org.jetbrains.kotlin.codegen.ClassBuilder
|
||||||
import org.jetbrains.kotlin.codegen.SourceInfo
|
import org.jetbrains.kotlin.codegen.SourceInfo
|
||||||
|
import org.jetbrains.kotlin.codegen.inline2.CallSiteMarker
|
||||||
import org.jetbrains.org.objectweb.asm.Label
|
import org.jetbrains.org.objectweb.asm.Label
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -29,10 +30,10 @@ class SMAPBuilder(
|
|||||||
val path: String,
|
val path: String,
|
||||||
val fileMappings: List<FileMapping>
|
val fileMappings: List<FileMapping>
|
||||||
) {
|
) {
|
||||||
private val header = "SMAP\n$source\nKotlin\n*S Kotlin"
|
private val header = "SMAP\n$source\nKotlin"
|
||||||
|
|
||||||
fun build(): String? {
|
fun build(): String? {
|
||||||
var realMappings = fileMappings.filter {
|
val realMappings = fileMappings.filter {
|
||||||
val mappings = it.lineMappings
|
val mappings = it.lineMappings
|
||||||
mappings.isNotEmpty() && mappings.first() != RangeMapping.SKIP
|
mappings.isNotEmpty() && mappings.first() != RangeMapping.SKIP
|
||||||
}
|
}
|
||||||
@@ -41,10 +42,32 @@ class SMAPBuilder(
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val defaultStrata = generateDefaultStrata(realMappings)
|
||||||
|
val debugStrata = generateDebugStrata(realMappings)
|
||||||
|
|
||||||
|
return "$header\n$defaultStrata$debugStrata"
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun generateDefaultStrata(realMappings: List<FileMapping>): String {
|
||||||
val fileIds = "*F" + realMappings.mapIndexed { id, file -> "\n${file.toSMAPFile(id + 1)}" }.joinToString("")
|
val fileIds = "*F" + realMappings.mapIndexed { id, file -> "\n${file.toSMAPFile(id + 1)}" }.joinToString("")
|
||||||
val lineMappings = "*L" + realMappings.joinToString("") { it.toSMAPMapping() }
|
val lineMappings = "*L" + realMappings.joinToString("") { it.toSMAPMapping() }
|
||||||
|
return "*S Kotlin\n$fileIds\n$lineMappings\n*E\n"
|
||||||
|
}
|
||||||
|
|
||||||
return "$header\n$fileIds\n$lineMappings\n*E\n"
|
private fun generateDebugStrata(realMappings: List<FileMapping>): String {
|
||||||
|
val combinedMapping = FileMapping(source, path)
|
||||||
|
realMappings.forEach { fileMapping ->
|
||||||
|
fileMapping.lineMappings.filter { it.callSiteMarker != null }.forEach { rangeMapping ->
|
||||||
|
combinedMapping.addRangeMapping(RangeMapping(rangeMapping.callSiteMarker!!.lineNumber, rangeMapping.dest, rangeMapping.range))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (combinedMapping.lineMappings.isEmpty()) return ""
|
||||||
|
|
||||||
|
val newMappings = listOf(combinedMapping)
|
||||||
|
val fileIds = "*F" + newMappings.mapIndexed { id, file -> "\n${file.toSMAPFile(id + 1)}" }.joinToString("")
|
||||||
|
val lineMappings = "*L" + newMappings.joinToString("") { it.toSMAPMapping() }
|
||||||
|
return "*S KotlinDebug\n$fileIds\n$lineMappings\n*E\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun RangeMapping.toSMAP(fileId: Int): String {
|
private fun RangeMapping.toSMAP(fileId: Int): String {
|
||||||
@@ -145,9 +168,7 @@ interface SourceMapper {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun flushToClassBuilder(mapper: SourceMapper, v: ClassBuilder) {
|
fun flushToClassBuilder(mapper: SourceMapper, v: ClassBuilder) {
|
||||||
for (fileMapping in mapper.resultMappings) {
|
mapper.resultMappings.forEach { fileMapping -> v.addSMAP(fileMapping) }
|
||||||
v.addSMAP(fileMapping)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createFromSmap(smap: SMAP): SourceMapper {
|
fun createFromSmap(smap: SMAP): SourceMapper {
|
||||||
@@ -333,7 +354,7 @@ open class FileMapping(val name: String, val path: String) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO comparable
|
//TODO comparable
|
||||||
data class RangeMapping(val source: Int, val dest: Int, var range: Int = 1) {
|
data class RangeMapping(val source: Int, val dest: Int, var range: Int = 1, var callSiteMarker: CallSiteMarker? = null) {
|
||||||
var parent: FileMapping? = null
|
var parent: FileMapping? = null
|
||||||
private val skip = source == -1 && dest == -1
|
private val skip = source == -1 && dest == -1
|
||||||
|
|
||||||
@@ -370,3 +391,6 @@ data class RangeMapping(val source: Int, val dest: Int, var range: Int = 1) {
|
|||||||
val SKIP = RangeMapping(-1, -1, 1)
|
val SKIP = RangeMapping(-1, -1, 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val RangeMapping.toRange: IntRange
|
||||||
|
get() = this.dest..this.maxDest
|
||||||
|
|||||||
@@ -26,6 +26,9 @@ import org.jetbrains.org.objectweb.asm.Label
|
|||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
|
class CallSiteMarker(val lineNumber: Int)
|
||||||
|
|
||||||
open class NestedSourceMapper(
|
open class NestedSourceMapper(
|
||||||
override val parent: SourceMapper, val ranges: List<RangeMapping>, sourceInfo: SourceInfo
|
override val parent: SourceMapper, val ranges: List<RangeMapping>, sourceInfo: SourceInfo
|
||||||
) : DefaultSourceMapper(sourceInfo) {
|
) : DefaultSourceMapper(sourceInfo) {
|
||||||
@@ -86,6 +89,12 @@ open class DefaultSourceMapper @JvmOverloads constructor(
|
|||||||
protected var maxUsedValue: Int = sourceInfo.linesInFile
|
protected var maxUsedValue: Int = sourceInfo.linesInFile
|
||||||
) : SourceMapper {
|
) : SourceMapper {
|
||||||
|
|
||||||
|
var callSiteMarker: CallSiteMarker? = null;
|
||||||
|
set(value) {
|
||||||
|
lastMappedWithChanges = null
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
|
||||||
var lastVisited: RawFileMapping? = null
|
var lastVisited: RawFileMapping? = null
|
||||||
private var lastMappedWithChanges: RawFileMapping? = null
|
private var lastMappedWithChanges: RawFileMapping? = null
|
||||||
private var fileMappings: LinkedHashMap<String, RawFileMapping> = linkedMapOf()
|
private var fileMappings: LinkedHashMap<String, RawFileMapping> = linkedMapOf()
|
||||||
@@ -139,8 +148,7 @@ open class DefaultSourceMapper @JvmOverloads constructor(
|
|||||||
|
|
||||||
protected fun createMapping(lineNumber: Int): Int {
|
protected fun createMapping(lineNumber: Int): Int {
|
||||||
val fileMapping = lastVisited!!
|
val fileMapping = lastVisited!!
|
||||||
//val mappedLineIndex = fileMapping.mapLine(lineNumber, maxUsedValue, lastMappedWithChanges == lastVisited)
|
val mappedLineIndex = fileMapping.mapNewLineNumber(lineNumber, maxUsedValue, lastMappedWithChanges == lastVisited, callSiteMarker)
|
||||||
val mappedLineIndex = fileMapping.mapNewLineNumber(lineNumber, maxUsedValue, lastMappedWithChanges == lastVisited)
|
|
||||||
if (mappedLineIndex > maxUsedValue) {
|
if (mappedLineIndex > maxUsedValue) {
|
||||||
lastMappedWithChanges = fileMapping
|
lastMappedWithChanges = fileMapping
|
||||||
maxUsedValue = mappedLineIndex
|
maxUsedValue = mappedLineIndex
|
||||||
@@ -167,7 +175,7 @@ class RawFileMapping(val name: String, val path: String) {
|
|||||||
lastMappedWithNewIndex = end
|
lastMappedWithNewIndex = end
|
||||||
}
|
}
|
||||||
|
|
||||||
fun mapNewLineNumber(source: Int, currentIndex: Int, isLastMapped: Boolean): Int {
|
fun mapNewLineNumber(source: Int, currentIndex: Int, isLastMapped: Boolean, callSiteMarker: CallSiteMarker?): Int {
|
||||||
val dest: Int
|
val dest: Int
|
||||||
val rangeMapping: RangeMapping
|
val rangeMapping: RangeMapping
|
||||||
if (rangeMappings.isNotEmpty() && isLastMapped && couldFoldInRange(lastMappedWithNewIndex, source)) {
|
if (rangeMappings.isNotEmpty() && isLastMapped && couldFoldInRange(lastMappedWithNewIndex, source)) {
|
||||||
@@ -177,7 +185,7 @@ class RawFileMapping(val name: String, val path: String) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
dest = currentIndex + 1
|
dest = currentIndex + 1
|
||||||
rangeMapping = RangeMapping(source, dest)
|
rangeMapping = RangeMapping(source, dest, callSiteMarker = callSiteMarker)
|
||||||
rangeMappings.add(rangeMapping)
|
rangeMappings.add(rangeMapping)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.backend.common.output.OutputFile
|
|||||||
import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil
|
import org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil
|
||||||
import org.jetbrains.kotlin.codegen.inline.RangeMapping
|
import org.jetbrains.kotlin.codegen.inline.RangeMapping
|
||||||
import org.jetbrains.kotlin.codegen.inline.SMAPParser
|
import org.jetbrains.kotlin.codegen.inline.SMAPParser
|
||||||
|
import org.jetbrains.kotlin.codegen.inline.toRange
|
||||||
import org.jetbrains.kotlin.utils.keysToMap
|
import org.jetbrains.kotlin.utils.keysToMap
|
||||||
import org.jetbrains.org.objectweb.asm.ClassReader
|
import org.jetbrains.org.objectweb.asm.ClassReader
|
||||||
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
||||||
@@ -121,6 +122,3 @@ object SMAPTestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val RangeMapping.toRange: IntRange
|
|
||||||
get() = this.dest..this.maxDest
|
|
||||||
|
|||||||
Reference in New Issue
Block a user