Minor. Add test with boolean parameter

This commit is contained in:
Ilmir Usmanov
2020-08-11 19:54:29 +02:00
parent bcbb050326
commit 31e4ddafd1
7 changed files with 241 additions and 2 deletions
@@ -471,11 +471,16 @@ class CoroutineCodegenForLambda private constructor(
val fieldStackValue = StackValue.field(fieldForParameter, generateThisOrOuter(context.thisDescriptor, false))
val originalType = typeMapper.mapType(parameter.type)
// If a parameter has reference type, it has prefix L$,
// however, when the type is primitive, its prefix is ${type.descriptor}$.
// In other words, it the type is Boolean, the prefix is Z$.
// This is different from spilled variables, where all int-like primitives have prefix I$.
// This is not a problem, since we do not clean spilled primitives up
// and we do not coerce Int to Boolean, which takes quite a bit of bytecode (see coerceInt).
val normalizedType = originalType.normalize()
fieldStackValue.put(normalizedType, v)
val newIndex = myFrameMap.enter(parameter, originalType)
// FIXME: Coerce int
StackValue.coerce(normalizedType, originalType, v)
v.store(newIndex, originalType)
@@ -0,0 +1,20 @@
// WITH_RUNTIME
// WITH_COROUTINES
import helpers.*
import kotlin.coroutines.*
fun builder(c: suspend () -> Unit) {
c.startCoroutine(EmptyContinuation)
}
fun box(): String {
var res = "FAIL"
val lambda: suspend (Boolean) -> String = {
if (it) "OK" else "FAIL 1"
}
builder {
res = lambda(true)
}
return res
}
@@ -0,0 +1,102 @@
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class BooleanParameterKt$box$1 {
// source: 'booleanParameter.kt'
synthetic final field $lambda: kotlin.jvm.functions.Function2
synthetic final field $res: kotlin.jvm.internal.Ref$ObjectRef
field L$0: java.lang.Object
field label: int
inner (anonymous) class BooleanParameterKt$box$1
method <init>(p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.jvm.functions.Function2, p2: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final method invoke(p0: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class BooleanParameterKt$box$lambda$1 {
// source: 'booleanParameter.kt'
private synthetic field Z$0: boolean
field label: int
inner (anonymous) class BooleanParameterKt$box$lambda$1
method <init>(p0: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class BooleanParameterKt {
// source: 'booleanParameter.kt'
inner (anonymous) class BooleanParameterKt$box$1
inner (anonymous) class BooleanParameterKt$box$lambda$1
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void
}
@kotlin.Metadata
public abstract class helpers/ContinuationAdapter {
// source: 'CoroutineUtil.kt'
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.CoroutineContext
public method <init>(): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public abstract method resume(p0: java.lang.Object): void
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
public abstract method resumeWithException(@org.jetbrains.annotations.NotNull p0: java.lang.Throwable): void
}
@kotlin.Metadata
public final class helpers/CoroutineUtilKt$handleExceptionContinuation$1 {
// source: 'CoroutineUtil.kt'
synthetic final field $x: kotlin.jvm.functions.Function1
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.EmptyCoroutineContext
inner (anonymous) class helpers/CoroutineUtilKt$handleExceptionContinuation$1
method <init>(p0: kotlin.jvm.functions.Function1): void
public synthetic bridge method getContext(): kotlin.coroutines.CoroutineContext
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.EmptyCoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
}
@kotlin.Metadata
public final class helpers/CoroutineUtilKt$handleResultContinuation$1 {
// source: 'CoroutineUtil.kt'
synthetic final field $x: kotlin.jvm.functions.Function1
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.EmptyCoroutineContext
inner (anonymous) class helpers/CoroutineUtilKt$handleResultContinuation$1
method <init>(p0: kotlin.jvm.functions.Function1): void
public synthetic bridge method getContext(): kotlin.coroutines.CoroutineContext
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.EmptyCoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
}
@kotlin.Metadata
public final class helpers/CoroutineUtilKt {
// source: 'CoroutineUtil.kt'
inner (anonymous) class helpers/CoroutineUtilKt$handleExceptionContinuation$1
inner (anonymous) class helpers/CoroutineUtilKt$handleResultContinuation$1
public final static @org.jetbrains.annotations.NotNull method handleExceptionContinuation(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): kotlin.coroutines.Continuation
public final static @org.jetbrains.annotations.NotNull method handleResultContinuation(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): kotlin.coroutines.Continuation
}
@kotlin.Metadata
public final class helpers/EmptyContinuation$Companion {
// source: 'CoroutineUtil.kt'
private method <init>(): void
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
public final inner class helpers/EmptyContinuation$Companion
}
@kotlin.Metadata
public class helpers/EmptyContinuation {
// source: 'CoroutineUtil.kt'
public final static @org.jetbrains.annotations.NotNull field Companion: helpers.EmptyContinuation$Companion
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.CoroutineContext
static method <clinit>(): void
public method <init>(): void
public method <init>(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.CoroutineContext): void
public synthetic method <init>(p0: kotlin.coroutines.CoroutineContext, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
public final inner class helpers/EmptyContinuation$Companion
}
@@ -0,0 +1,102 @@
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class BooleanParameterKt$box$1 {
// source: 'booleanParameter.kt'
synthetic final field $lambda: kotlin.jvm.functions.Function2
synthetic final field $res: kotlin.jvm.internal.Ref$ObjectRef
field L$0: java.lang.Object
field label: int
inner (anonymous) class BooleanParameterKt$box$1
method <init>(p0: kotlin.jvm.internal.Ref$ObjectRef, p1: kotlin.jvm.functions.Function2, p2: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final method invoke(p0: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.coroutines.jvm.internal.DebugMetadata
@kotlin.Metadata
final class BooleanParameterKt$box$lambda$1 {
// source: 'booleanParameter.kt'
synthetic field it: boolean
field label: int
inner (anonymous) class BooleanParameterKt$box$lambda$1
method <init>(p0: kotlin.coroutines.Continuation): void
public final @org.jetbrains.annotations.NotNull method create(@org.jetbrains.annotations.Nullable p0: java.lang.Object, @org.jetbrains.annotations.NotNull p1: kotlin.coroutines.Continuation): kotlin.coroutines.Continuation
public final method invoke(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object
public final @org.jetbrains.annotations.Nullable method invokeSuspend(@org.jetbrains.annotations.NotNull p0: java.lang.Object): java.lang.Object
}
@kotlin.Metadata
public final class BooleanParameterKt {
// source: 'booleanParameter.kt'
inner (anonymous) class BooleanParameterKt$box$1
inner (anonymous) class BooleanParameterKt$box$lambda$1
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
public final static method builder(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): void
}
@kotlin.Metadata
public abstract class helpers/ContinuationAdapter {
// source: 'CoroutineUtil.kt'
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.CoroutineContext
public method <init>(): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public abstract method resume(p0: java.lang.Object): void
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
public abstract method resumeWithException(@org.jetbrains.annotations.NotNull p0: java.lang.Throwable): void
}
@kotlin.Metadata
public final class helpers/CoroutineUtilKt$handleExceptionContinuation$1 {
// source: 'CoroutineUtil.kt'
private synthetic final field $x: kotlin.jvm.functions.Function1
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.EmptyCoroutineContext
inner (anonymous) class helpers/CoroutineUtilKt$handleExceptionContinuation$1
method <init>(p0: kotlin.jvm.functions.Function1): void
public synthetic bridge method getContext(): kotlin.coroutines.CoroutineContext
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.EmptyCoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
}
@kotlin.Metadata
public final class helpers/CoroutineUtilKt$handleResultContinuation$1 {
// source: 'CoroutineUtil.kt'
private synthetic final field $x: kotlin.jvm.functions.Function1
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.EmptyCoroutineContext
inner (anonymous) class helpers/CoroutineUtilKt$handleResultContinuation$1
method <init>(p0: kotlin.jvm.functions.Function1): void
public synthetic bridge method getContext(): kotlin.coroutines.CoroutineContext
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.EmptyCoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
}
@kotlin.Metadata
public final class helpers/CoroutineUtilKt {
// source: 'CoroutineUtil.kt'
inner (anonymous) class helpers/CoroutineUtilKt$handleExceptionContinuation$1
inner (anonymous) class helpers/CoroutineUtilKt$handleResultContinuation$1
public final static @org.jetbrains.annotations.NotNull method handleExceptionContinuation(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): kotlin.coroutines.Continuation
public final static @org.jetbrains.annotations.NotNull method handleResultContinuation(@org.jetbrains.annotations.NotNull p0: kotlin.jvm.functions.Function1): kotlin.coroutines.Continuation
}
@kotlin.Metadata
public final class helpers/EmptyContinuation$Companion {
// source: 'CoroutineUtil.kt'
private method <init>(): void
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
public final inner class helpers/EmptyContinuation$Companion
}
@kotlin.Metadata
public class helpers/EmptyContinuation {
// source: 'CoroutineUtil.kt'
public final static @org.jetbrains.annotations.NotNull field Companion: helpers.EmptyContinuation$Companion
private final @org.jetbrains.annotations.NotNull field context: kotlin.coroutines.CoroutineContext
static method <clinit>(): void
public method <init>(): void
public method <init>(@org.jetbrains.annotations.NotNull p0: kotlin.coroutines.CoroutineContext): void
public synthetic method <init>(p0: kotlin.coroutines.CoroutineContext, p1: int, p2: kotlin.jvm.internal.DefaultConstructorMarker): void
public @org.jetbrains.annotations.NotNull method getContext(): kotlin.coroutines.CoroutineContext
public method resumeWith(@org.jetbrains.annotations.NotNull p0: java.lang.Object): void
public final inner class helpers/EmptyContinuation$Companion
}
@@ -4,7 +4,7 @@
"visibility": "local",
"class": "SuspendLambdaKt$invokeCoroutineBuilder$1",
"members": [
{"visibility": "local", "declaration": "<this>", "name": "p$", "desc": "Ljava/lang/Object;"},
{"visibility": "local", "declaration": "<this>", "name": "L$0", "desc": "Ljava/lang/Object;"},
{"name": "invokeSuspend", "desc": "(Ljava/lang/Object;)Ljava/lang/Object;"},
{"visibility": "local", "declaration": "final suspend fun kotlin.Any.<anonymous>(): kotlin.Unit", "name": "<init>", "desc": "(Lkotlin/coroutines/Continuation;)V"},
{"name": "label", "desc": "I"},
@@ -353,6 +353,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/coroutines/spilling"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@TestMetadata("booleanParameter.kt")
public void testBooleanParameter() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/coroutines/spilling/booleanParameter.kt");
}
@TestMetadata("component1.kt")
public void testComponent1() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.kt");
@@ -323,6 +323,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/coroutines/spilling"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}
@TestMetadata("booleanParameter.kt")
public void testBooleanParameter() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/coroutines/spilling/booleanParameter.kt");
}
@TestMetadata("component1.kt")
public void testComponent1() throws Exception {
runTest("compiler/testData/codegen/bytecodeListing/coroutines/spilling/component1.kt");