Do not spill dispatch receiver of suspend functions if it is not used
#KT-20571
This commit is contained in:
+8
-8
@@ -20,6 +20,7 @@ import org.jetbrains.org.objectweb.asm.Opcodes
|
||||
import org.jetbrains.org.objectweb.asm.Type
|
||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
|
||||
import org.jetbrains.org.objectweb.asm.tree.*
|
||||
import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue
|
||||
import kotlin.math.max
|
||||
|
||||
private const val COROUTINES_DEBUG_METADATA_VERSION = 1
|
||||
@@ -610,14 +611,13 @@ class CoroutineTransformerMethodVisitor(
|
||||
// k - continuation
|
||||
// k + 1 - data
|
||||
// k + 2 - exception
|
||||
val variablesToSpill =
|
||||
(0 until localsCount)
|
||||
.filterNot { it in setOf(continuationIndex, dataIndex, exceptionIndex) }
|
||||
.map { Pair(it, frame.getLocal(it)) }
|
||||
.filter { (index, value) ->
|
||||
(index == 0 && needDispatchReceiver && isForNamedFunction) ||
|
||||
(value.type != null && livenessFrame.isAlive(index))
|
||||
}
|
||||
val variablesToSpill = arrayListOf<Pair<Int, BasicValue>>()
|
||||
for (slot in 0 until localsCount) {
|
||||
if (slot == continuationIndex || slot == dataIndex || slot == exceptionIndex) continue
|
||||
val value = frame.getLocal(slot)
|
||||
if (value.type == null || !livenessFrame.isAlive(slot)) continue
|
||||
variablesToSpill += slot to value
|
||||
}
|
||||
|
||||
for ((index, basicValue) in variablesToSpill) {
|
||||
if (basicValue == StrictBasicValue.NULL_VALUE) {
|
||||
|
||||
-10
@@ -3,7 +3,6 @@
|
||||
public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1
|
||||
@@ -16,7 +15,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 {
|
||||
@kotlin.Metadata
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1
|
||||
@@ -55,7 +53,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$fold$$inlined$consumeEach$1
|
||||
@@ -83,7 +80,6 @@ public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$1 {
|
||||
public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1
|
||||
@@ -96,7 +92,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 {
|
||||
@kotlin.Metadata
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2
|
||||
@@ -182,7 +177,6 @@ public final class CrossinlineKt$consumeEach$2 {
|
||||
public final class CrossinlineKt$filter$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1
|
||||
@@ -195,7 +189,6 @@ public final class CrossinlineKt$filter$$inlined$source$1$1 {
|
||||
@kotlin.Metadata
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$filter$$inlined$source$1$lambda$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1$lambda$1
|
||||
@@ -234,7 +227,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1
|
||||
@@ -277,7 +269,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field L$3: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$range$$inlined$source$1
|
||||
@@ -304,7 +295,6 @@ public final class CrossinlineKt$source$1$consume$1 {
|
||||
// source: 'crossinline.kt'
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$source$1
|
||||
|
||||
-10
@@ -2,7 +2,6 @@
|
||||
public final class CrossinlineKt$box$1$doResume$$inlined$filter$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$box$1$doResume$$inlined$filter$1
|
||||
@@ -16,7 +15,6 @@ public final class CrossinlineKt$box$1$doResume$$inlined$filter$1$1 {
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class CrossinlineKt$box$1$doResume$$inlined$filter$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$box$1$doResume$$inlined$filter$1$2
|
||||
@@ -64,7 +62,6 @@ public final class CrossinlineKt$box$1$doResume$$inlined$fold$1 {
|
||||
public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1
|
||||
@@ -78,7 +75,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1$1 {
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$box$1$filter$$inlined$source$1$lambda$1
|
||||
@@ -118,7 +114,6 @@ public final class CrossinlineKt$box$1$filter$$inlined$source$1 {
|
||||
@kotlin.Metadata
|
||||
public final class CrossinlineKt$box$1$fold$$inlined$consumeEach$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$box$1$fold$$inlined$consumeEach$1
|
||||
@@ -186,7 +181,6 @@ public final class CrossinlineKt$consumeEach$2 {
|
||||
public final class CrossinlineKt$filter$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1
|
||||
@@ -200,7 +194,6 @@ public final class CrossinlineKt$filter$$inlined$source$1$1 {
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class CrossinlineKt$filter$$inlined$source$1$lambda$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1$lambda$1
|
||||
@@ -240,7 +233,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 {
|
||||
@kotlin.Metadata
|
||||
public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1
|
||||
@@ -285,7 +277,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field L$3: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$range$$inlined$source$1
|
||||
@@ -313,7 +304,6 @@ public final class CrossinlineKt$source$1$consume$1 {
|
||||
// source: 'crossinline.kt'
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: CrossinlineKt$source$1
|
||||
|
||||
-7
@@ -3,7 +3,6 @@
|
||||
public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1
|
||||
@@ -16,7 +15,6 @@ public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$1 {
|
||||
@kotlin.Metadata
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$box$1$invokeSuspend$$inlined$filter$1$2
|
||||
@@ -101,7 +99,6 @@ public final class CrossinlineKt$consumeEach$2 {
|
||||
public final class CrossinlineKt$filter$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$filter$$inlined$source$1
|
||||
@@ -126,7 +123,6 @@ public final class CrossinlineKt$filter$$inlined$source$1 {
|
||||
@kotlin.Metadata
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1
|
||||
@@ -153,7 +149,6 @@ public final class CrossinlineKt$filter$lambda-3$$inlined$consumeEach$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class CrossinlineKt$fold$$inlined$consumeEach$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$fold$$inlined$consumeEach$1
|
||||
@@ -196,7 +191,6 @@ public final class CrossinlineKt$range$$inlined$source$1$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field L$3: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$range$$inlined$source$1
|
||||
@@ -223,7 +217,6 @@ public final class CrossinlineKt$source$1$consume$1 {
|
||||
// source: 'crossinline.kt'
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field L$2: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: CrossinlineKt$source$1
|
||||
|
||||
-1
@@ -29,7 +29,6 @@ final class Override5Kt$box$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class Override5Kt$inlineMe$1$generic$1 {
|
||||
// source: 'override5.kt'
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: Override5Kt$inlineMe$1
|
||||
|
||||
-1
@@ -29,7 +29,6 @@ final class Override5Kt$box$1 {
|
||||
@kotlin.Metadata
|
||||
public final class Override5Kt$inlineMe$1$generic$1 {
|
||||
// source: 'override5.kt'
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: Override5Kt$inlineMe$1
|
||||
|
||||
@@ -15,7 +15,6 @@ final class Controller$multipleSuspensions$1 {
|
||||
@kotlin.Metadata
|
||||
final class Controller$nonTailCall$1 {
|
||||
// source: 'coroutineFields.kt'
|
||||
field L$0: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: Controller
|
||||
|
||||
@@ -15,7 +15,6 @@ final class Controller$multipleSuspensions$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
final class Controller$nonTailCall$1 {
|
||||
// source: 'coroutineFields.kt'
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: Controller
|
||||
|
||||
@@ -15,7 +15,6 @@ final class Controller$multipleSuspensions$1 {
|
||||
@kotlin.Metadata
|
||||
final class Controller$nonTailCall$1 {
|
||||
// source: 'coroutineFields.kt'
|
||||
field L$0: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: Controller
|
||||
|
||||
@@ -79,7 +79,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 {
|
||||
@kotlin.Metadata
|
||||
public final class TcoContinuationKt$foo$$inlined$map$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2
|
||||
@@ -127,7 +126,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 {
|
||||
@kotlin.Metadata
|
||||
public final class TcoContinuationKt$map$$inlined$transform$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2
|
||||
@@ -179,7 +177,6 @@ public final class TcoContinuationKt$map$$inlined$transform$2$1 {
|
||||
@kotlin.Metadata
|
||||
public final class TcoContinuationKt$map$$inlined$transform$2$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
synthetic field data: java.lang.Object
|
||||
synthetic field exception: java.lang.Throwable
|
||||
synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$2$2
|
||||
|
||||
@@ -76,7 +76,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class TcoContinuationKt$foo$$inlined$map$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2
|
||||
@@ -121,7 +120,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class TcoContinuationKt$map$$inlined$transform$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2
|
||||
@@ -170,7 +168,6 @@ public final class TcoContinuationKt$map$$inlined$transform$2$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class TcoContinuationKt$map$$inlined$transform$2$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$2$2
|
||||
|
||||
@@ -76,7 +76,6 @@ public final class TcoContinuationKt$foo$$inlined$flow$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class TcoContinuationKt$foo$$inlined$map$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: TcoContinuationKt$foo$$inlined$map$1$2
|
||||
@@ -120,7 +119,6 @@ public final class TcoContinuationKt$map$$inlined$transform$1$1 {
|
||||
@kotlin.coroutines.jvm.internal.DebugMetadata
|
||||
public final class TcoContinuationKt$map$$inlined$transform$1$2$1 {
|
||||
field L$0: java.lang.Object
|
||||
field L$1: java.lang.Object
|
||||
field label: int
|
||||
synthetic field result: java.lang.Object
|
||||
synthetic final field this$0: TcoContinuationKt$map$$inlined$transform$1$2
|
||||
|
||||
Reference in New Issue
Block a user