Don't generate source mapping on inlining 'InlineOnly' functions

This commit is contained in:
Michael Bogdanov
2016-02-17 15:05:32 +03:00
parent 6f1def9366
commit 1d17bee6cc
17 changed files with 143 additions and 5 deletions
@@ -38,6 +38,7 @@ import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.annotations.AnnotationUtilKt;
import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.resolve.inline.InlineUtil;
@@ -276,7 +277,8 @@ public class InlineCodegen extends CallGenerator {
InliningContext info = new RootInliningContext(
expressionMap, state, codegen.getInlineNameGenerator().subGenerator(jvmSignature.getAsmMethod().getName()),
codegen.getContext(), callElement, getInlineCallSiteInfo(), reifiedTypeInliner, typeParameterMappings, isDefaultCompilation
codegen.getContext(), callElement, getInlineCallSiteInfo(), reifiedTypeInliner, typeParameterMappings, isDefaultCompilation,
AnnotationUtilKt.hasInlineOnlyAnnotation(functionDescriptor)
);
MethodInliner inliner = new MethodInliner(node, parameters, info, new FieldRemapper(null, null, parameters), isSameModule,
@@ -71,6 +71,8 @@ public class MethodInliner {
private int lambdasFinallyBlocks;
private final boolean skipSmap;
/*
*
* @param node
@@ -98,6 +100,7 @@ public class MethodInliner {
this.inlineCallSiteInfo = inlineCallSiteInfo;
this.typeMapper = inliningContext.state.getTypeMapper();
this.result = InlineResult.create();
skipSmap = inliningContext instanceof RootInliningContext && ((RootInliningContext) inliningContext).skipSmap;
}
public InlineResult doInline(
@@ -339,6 +342,8 @@ public class MethodInliner {
node.instructions.resetLabels();
MethodNode transformedNode = new MethodNode(InlineCodegenUtil.API, node.access, node.name, Type.getMethodDescriptor(returnType, allTypes), node.signature, null) {
private final boolean GENERATE_DEBUG_INFO = InlineCodegenUtil.GENERATE_SMAP && !skipSmap;
private final boolean isInliningLambda = nodeRemapper.isInsideInliningLambda();
private int getNewIndex(int var) {
@@ -362,7 +367,7 @@ public class MethodInliner {
@Override
public void visitLineNumber(int line, @NotNull Label start) {
if(isInliningLambda || InlineCodegenUtil.GENERATE_SMAP) {
if(isInliningLambda || GENERATE_DEBUG_INFO) {
super.visitLineNumber(line, start);
}
}
@@ -371,7 +376,7 @@ public class MethodInliner {
public void visitLocalVariable(
@NotNull String name, @NotNull String desc, String signature, @NotNull Label start, @NotNull Label end, int index
) {
if (isInliningLambda || InlineCodegenUtil.GENERATE_SMAP) {
if (isInliningLambda || GENERATE_DEBUG_INFO) {
String varSuffix = inliningContext.isRoot() &&
!isDefaultCompilation() &&
!InlineCodegenUtil.isFakeLocalVariableForInline(name) ?
@@ -29,6 +29,7 @@ public class RootInliningContext extends InliningContext {
private final InlineCallSiteInfo inlineCallSiteInfo;
public final TypeParameterMappings typeParameterMappings;
public final boolean isDefaultCompilation;
public final boolean skipSmap;
public final KtElement callElement;
public RootInliningContext(
@@ -40,7 +41,8 @@ public class RootInliningContext extends InliningContext {
@NotNull InlineCallSiteInfo classNameToInline,
@NotNull ReifiedTypeInliner inliner,
@Nullable TypeParameterMappings typeParameterMappings,
boolean isDefaultCompilation
boolean isDefaultCompilation,
boolean skipSmap
) {
super(null, map, state, nameGenerator, TypeRemapper.createRoot(typeParameterMappings), inliner, false, false);
this.callElement = callElement;
@@ -48,6 +50,7 @@ public class RootInliningContext extends InliningContext {
this.inlineCallSiteInfo = classNameToInline;
this.typeParameterMappings = typeParameterMappings;
this.isDefaultCompilation = isDefaultCompilation;
this.skipSmap = skipSmap;
}
@Override
@@ -0,0 +1,14 @@
fun box(): String {
return "KO".reversed()
}
//SMAP
//noSmap.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 noSmap.1.kt
//NoSmap_1Kt
//*L
//1#1,14:1
//*E
@@ -0,0 +1,4 @@
package test
inline fun stub() {
}
@@ -0,0 +1,22 @@
import test.*
fun box(): String {
val z = className<String>()
if (z != "String") return "fail: $z"
return "OK"
}
//SMAP
//reified.1.kt
//Kotlin
//*S Kotlin
//*F
//+ 1 reified.1.kt
//Reified_1Kt
//+ 2 reified.2.kt
//test/Reified_2Kt
//*L
//1#1,22:1
//3#2:23
//*E
@@ -0,0 +1,3 @@
package test
inline fun <reified T> className() = T::class.simpleName
@@ -0,0 +1 @@
Return code: 0
@@ -0,0 +1,5 @@
package InlineOnly
fun main(args : Array<String>) {
error("my error")
}
@@ -0,0 +1,6 @@
ERR:
Exception in thread "main" java.lang.IllegalStateException: my error
at InlineOnly.InlineOnlyKt.main(inlineOnly.kt:4)
Return code: 1
@@ -1,7 +1,7 @@
ERR:
java.lang.IllegalStateException: my error
at Script.main(script.kts:12)
at Script.main(script.kts:2)
at Script.a(script.kts:6)
at Script.<init>(script.kts:9)
@@ -1834,6 +1834,27 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
}
}
@TestMetadata("compiler/testData/codegen/boxInline/smap/inlineOnly")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class InlineOnly extends AbstractBlackBoxInlineCodegenTest {
public void testAllFilesPresentInInlineOnly() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/smap/inlineOnly"), Pattern.compile("^(.+)\\.1.kt$"), true);
}
@TestMetadata("noSmap.1.kt")
public void testNoSmap() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/smap/inlineOnly/noSmap.1.kt");
doTestMultiFileWithInlineCheck(fileName);
}
@TestMetadata("reified.1.kt")
public void testReified() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/smap/inlineOnly/reified.1.kt");
doTestMultiFileWithInlineCheck(fileName);
}
}
@TestMetadata("compiler/testData/codegen/boxInline/smap/resolve")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -70,4 +70,12 @@ public class CompilerSmokeTest extends CompilerSmokeTestBase {
runCompiler("script", "script.kts", "-d", jar);
}
public void testInlineOnly() throws Exception {
String jar = tmpdir.getAbsolutePath() + File.separator + "inlineOnly.jar";
assertEquals("compilation failed", 0, runCompiler("inlineOnly.compile", "-include-runtime", "inlineOnly.kt", "-d", jar));
run("inlineOnly.run", "-cp", jar, "InlineOnly.InlineOnlyKt");
}
}
@@ -1834,6 +1834,27 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
}
}
@TestMetadata("compiler/testData/codegen/boxInline/smap/inlineOnly")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class InlineOnly extends AbstractCompileKotlinAgainstInlineKotlinTest {
public void testAllFilesPresentInInlineOnly() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxInline/smap/inlineOnly"), Pattern.compile("^(.+)\\.1.kt$"), true);
}
@TestMetadata("noSmap.1.kt")
public void testNoSmap() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/smap/inlineOnly/noSmap.1.kt");
doBoxTestWithInlineCheck(fileName);
}
@TestMetadata("reified.1.kt")
public void testReified() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/smap/inlineOnly/reified.1.kt");
doBoxTestWithInlineCheck(fileName);
}
}
@TestMetadata("compiler/testData/codegen/boxInline/smap/resolve")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
+9
View File
@@ -0,0 +1,9 @@
LineBreakpoint created at inlineOnly.kt:5
!JDK_HOME!\bin\java -agentlib:jdwp=transport=dt_socket,address=!HOST_NAME!:!HOST_PORT!,suspend=y,server=n -Dfile.encoding=!FILE_ENCODING! -classpath !OUTPUT_PATH!;!KOTLIN_RUNTIME!;!CUSTOM_LIBRARY!;!RT_JAR! inlineOnly.InlineOnlyKt
Connected to the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
inlineOnly.kt:5
PrintStream.!EXT!
Disconnected from the target VM, address: '!HOST_NAME!:PORT_NAME!', transport: 'socket'
Process finished with exit code 0
OK
@@ -0,0 +1,8 @@
package inlineOnly
fun main(args: Array<String>) {
//Breakpoint!
println("OK")
}
// TRACING_FILTERS_ENABLED: false
@@ -235,6 +235,12 @@ public class KotlinSteppingTestGenerated extends AbstractKotlinSteppingTest {
doStepIntoTest(fileName);
}
@TestMetadata("inlineOnly.kt")
public void testInlineOnly() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepInto/inlineOnly.kt");
doStepIntoTest(fileName);
}
@TestMetadata("returnVoid.kt")
public void testReturnVoid() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/debugger/tinyApp/src/stepping/stepInto/returnVoid.kt");