Generate linenumber for inline call site in case of implicit iterator/hasNext/next calls in for loop

Otherwise -1 is generated in smap
This commit is contained in:
Mikhael Bogdanov
2021-01-20 16:53:57 +01:00
parent dfacccf84f
commit de00f72fa3
12 changed files with 115 additions and 0 deletions
@@ -742,7 +742,11 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
// Some forms of for-loop can be optimized as post-condition loops.
PseudoInsnsKt.fakeAlwaysFalseIfeq(v, continueLabel);
// Renew line number cause it could be reset by inline (resetLastLineNumber) in generator.checkPreCondition(loopExit).
markStartLineNumber(generator.getForExpression());
v.nop();
generator.beforeBody();
blockStackElements.push(new LoopBlockStackElement(loopExit, continueLabel, targetLabel(generator.getForExpression())));
generator.body();
blockStackElements.pop();
@@ -3551,6 +3551,11 @@ public class FirBlackBoxInlineCodegenTestGenerated extends AbstractFirBlackBoxIn
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
+61
View File
@@ -0,0 +1,61 @@
// !LANGUAGE: +CorrectSourceMappingSyntax
// WITH_RUNTIME
// FILE: 1.kt
package test
inline fun stub() {
}
// FILE: 2.kt
fun box(): String {
//Breakpoint!
for (element in Some()) { // No inlining visible on this string
return nonInline(element)
}
return "fail"
}
fun <T> nonInline(p: T): T = p
class Some() {
operator fun iterator() = SomeIterator()
}
class SomeIterator {
var result = "OK"
inline operator fun hasNext() : Boolean {
return result == "OK"
}
inline operator fun next(): String {
result = "fail"
return "OK"
}
}
// FILE: 1.smap
// FILE: 2.smap
SMAP
2.kt
Kotlin
*S Kotlin
*F
+ 1 2.kt
_2Kt
+ 2 2.kt
SomeIterator
*L
1#1,31:1
21#2,6:32
*S KotlinDebug
*F
+ 1 2.kt
_2Kt
*L
5#1:32,6
*E
@@ -3551,6 +3551,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3551,6 +3551,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3551,6 +3551,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3551,6 +3551,11 @@ public class IrCompileKotlinAgainstInlineKotlinTestGenerated extends AbstractIrC
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3551,6 +3551,11 @@ public class JvmIrAgainstOldBoxInlineTestGenerated extends AbstractJvmIrAgainstO
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3551,6 +3551,11 @@ public class JvmOldAgainstIrBoxInlineTestGenerated extends AbstractJvmOldAgainst
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3151,6 +3151,11 @@ public class IrJsCodegenInlineES6TestGenerated extends AbstractIrJsCodegenInline
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3151,6 +3151,11 @@ public class IrJsCodegenInlineTestGenerated extends AbstractIrJsCodegenInlineTes
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");
@@ -3151,6 +3151,11 @@ public class JsCodegenInlineTestGenerated extends AbstractJsCodegenInlineTest {
runTest("compiler/testData/codegen/boxInline/smap/defaultFunctionWithInlineCall.kt");
}
@TestMetadata("forInline.kt")
public void testForInline() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/forInline.kt");
}
@TestMetadata("interleavedFiles.kt")
public void testInterleavedFiles() throws Exception {
runTest("compiler/testData/codegen/boxInline/smap/interleavedFiles.kt");