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 62ca36aa424..77dded0b185 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/SMAP.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.codegen.inline import gnu.trove.TIntIntHashMap import org.jetbrains.kotlin.codegen.SourceInfo -import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.org.objectweb.asm.tree.MethodNode import java.util.* import kotlin.math.max @@ -67,11 +66,11 @@ class SourceMapCopier(val parent: SourceMapper, private val smap: SMAP, val call return mappedLineNumber } - val newLineNumber = if (lineNumber in JvmAbi.SYNTHETIC_MARKER_LINE_NUMBERS) { - // This is a compatibility hack for reading bytecode generated by 1.4-M1. Once the bootstrap - // compiler is updated to a newer version, it can be removed (as newer bytecode explicitly lists - // this range in the SMAP). - parent.mapSyntheticLineNumber(lineNumber) + val newLineNumber = if (lineNumber == 65100) { + // TODO This is a compatibility hack for reading bytecode generated by 1.4-M1. Once the bootstrap + // compiler is updated to a newer version, it can be removed (as newer bytecode explicitly lists + // this range in the SMAP). + parent.mapSyntheticLineNumber(InlineOnlySmapSkipper.LOCAL_VARIABLE_INLINE_ARGUMENT_SYNTHETIC_LINE_NUMBER) } else { val range = lastVisitedRange?.takeIf { lineNumber in it } ?: smap.findRange(lineNumber) ?: return -1 lastVisitedRange = range @@ -112,7 +111,6 @@ class SourceMapper(val sourceInfo: SourceInfo?) { } fun mapSyntheticLineNumber(id: Int): Int { - assert(id in JvmAbi.SYNTHETIC_MARKER_LINE_NUMBERS) { "$id is not a synthetic line number" } return mapLineNumber(SourcePosition(id, "fake.kt", "kotlin/jvm/internal/FakeKt"), null) } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt index ad1edfde591..94dea1a2e8b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/inlineCodegenUtils.kt @@ -541,6 +541,10 @@ internal fun isThis0(name: String): Boolean = AsmUtil.CAPTURED_THIS_FIELD == nam class InlineOnlySmapSkipper(codegen: BaseExpressionCodegen) { private val callLineNumber = codegen.lastLineNumber + companion object { + const val LOCAL_VARIABLE_INLINE_ARGUMENT_SYNTHETIC_LINE_NUMBER = 1 + } + fun onInlineLambdaStart(mv: MethodVisitor, info: LambdaInfo, smap: SourceMapper) { val firstLine = info.node.node.instructions.asSequence().mapNotNull { it as? LineNumberNode }.firstOrNull()?.line ?: -1 if (callLineNumber >= 0 && firstLine == callLineNumber) { @@ -552,7 +556,7 @@ class InlineOnlySmapSkipper(codegen: BaseExpressionCodegen) { // number that is remapped by the SMAP to a line that does not exist. val label = Label() mv.visitLabel(label) - mv.visitLineNumber(smap.mapSyntheticLineNumber(JvmAbi.LOCAL_VARIABLE_INLINE_ARGUMENT_SYNTHETIC_LINE_NUMBER), label) + mv.visitLineNumber(smap.mapSyntheticLineNumber(LOCAL_VARIABLE_INLINE_ARGUMENT_SYNTHETIC_LINE_NUMBER), label) } } diff --git a/compiler/testData/codegen/boxInline/smap/inlineOnly/stdlibInlineOnlyOneLine.kt b/compiler/testData/codegen/boxInline/smap/inlineOnly/stdlibInlineOnlyOneLine.kt index 245fe06fce7..f5d8378e8b3 100644 --- a/compiler/testData/codegen/boxInline/smap/inlineOnly/stdlibInlineOnlyOneLine.kt +++ b/compiler/testData/codegen/boxInline/smap/inlineOnly/stdlibInlineOnlyOneLine.kt @@ -26,5 +26,5 @@ _2Kt kotlin/jvm/internal/FakeKt *L 1#1,9:1 -65100#2:10 +1#2:10 *E diff --git a/compiler/testData/debug/stepping/voidLambdaStepInline.kt b/compiler/testData/debug/stepping/voidLambdaStepInline.kt index 2a350c003a2..a583e8021ad 100644 --- a/compiler/testData/debug/stepping/voidLambdaStepInline.kt +++ b/compiler/testData/debug/stepping/voidLambdaStepInline.kt @@ -10,7 +10,7 @@ fun box(): String { // LINENUMBERS // test.kt:4 -// fake.kt:65100 +// fake.kt:1 // test.kt:4 // test.kt:5 // test.kt:6 diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java index fead436aeb6..f4605974be5 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/java/JvmAbi.java @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.load.java; -import kotlin.collections.CollectionsKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.CompanionObjectMapping; import org.jetbrains.kotlin.descriptors.*; @@ -14,8 +13,6 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.util.capitalizeDecapitalize.CapitalizeDecapitalizeKt; -import java.util.List; - import static org.jetbrains.kotlin.resolve.DescriptorUtils.isClassOrEnumClass; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject; @@ -48,20 +45,6 @@ public final class JvmAbi { public static final ClassId REFLECTION_FACTORY_IMPL = ClassId.topLevel(new FqName("kotlin.reflect.jvm.internal.ReflectionFactoryImpl")); - /* - Line number is used when inlining function arguments to @InlineOnly functions. - All line information is stripped from the inlined implementation of such functions, - so if a lambda is on the same line with the call, the debugger can't stop on both 'line' and 'lambda' breakpoints. - - Example: - > require(foo) { "foo is false" } - */ - public static final int LOCAL_VARIABLE_INLINE_ARGUMENT_SYNTHETIC_LINE_NUMBER = 65100; - - public static final List SYNTHETIC_MARKER_LINE_NUMBERS = CollectionsKt.listOf( - LOCAL_VARIABLE_INLINE_ARGUMENT_SYNTHETIC_LINE_NUMBER - ); - public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_ARGUMENT = "$i$a$"; public static final String LOCAL_VARIABLE_NAME_PREFIX_INLINE_FUNCTION = "$i$f$";