diff --git a/compiler/testData/codegen/box/closures/refsAreSerializable.kt b/compiler/testData/codegen/box/closures/refsAreSerializable.kt new file mode 100644 index 00000000000..fa022cdb223 --- /dev/null +++ b/compiler/testData/codegen/box/closures/refsAreSerializable.kt @@ -0,0 +1,34 @@ +// IGNORE_BACKEND: JS + +import java.io.* + +fun box(): String { + var o = "" + var b = 0.toByte() + var d = 0.0 + var f = 0.0f + var i = 0 + var j = 0L + var s = 0.toShort() + var c = '0' + var z = false + + val lambda = fun(): String { + o = "OK" + b++; d++; f++; i++; j++; s++; c++ + z = true + return o + } + + val baos = ByteArrayOutputStream() + val oos = ObjectOutputStream(baos) + oos.writeObject(lambda) + oos.close() + + val bais = ByteArrayInputStream(baos.toByteArray()) + val ois = ObjectInputStream(bais) + val result = ois.readObject() as () -> String + ois.close() + + return result() +} diff --git a/compiler/testData/codegen/light-analysis/closures/refsAreSerializable.txt b/compiler/testData/codegen/light-analysis/closures/refsAreSerializable.txt new file mode 100644 index 00000000000..ef9448b7238 --- /dev/null +++ b/compiler/testData/codegen/light-analysis/closures/refsAreSerializable.txt @@ -0,0 +1,4 @@ +@kotlin.Metadata +public final class RefsAreSerializableKt { + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 91246d1d099..3d601406d60 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -3617,6 +3617,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("refsAreSerializable.kt") + public void testRefsAreSerializable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/refsAreSerializable.kt"); + doTest(fileName); + } + @TestMetadata("simplestClosure.kt") public void testSimplestClosure() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index d2e069b59e2..9c6c6d99877 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -3617,6 +3617,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("refsAreSerializable.kt") + public void testRefsAreSerializable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/refsAreSerializable.kt"); + doTest(fileName); + } + @TestMetadata("simplestClosure.kt") public void testSimplestClosure() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt"); diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/Ref.java b/core/runtime.jvm/src/kotlin/jvm/internal/Ref.java index c29942db0ce..11913864a47 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/Ref.java +++ b/core/runtime.jvm/src/kotlin/jvm/internal/Ref.java @@ -16,10 +16,12 @@ package kotlin.jvm.internal; +import java.io.Serializable; + public class Ref { private Ref() {} - public static final class ObjectRef { + public static final class ObjectRef implements Serializable { public T element; @Override @@ -28,7 +30,7 @@ public class Ref { } } - public static final class ByteRef { + public static final class ByteRef implements Serializable { public byte element; @Override @@ -37,7 +39,7 @@ public class Ref { } } - public static final class ShortRef { + public static final class ShortRef implements Serializable { public short element; @Override @@ -46,7 +48,7 @@ public class Ref { } } - public static final class IntRef { + public static final class IntRef implements Serializable { public int element; @Override @@ -55,7 +57,7 @@ public class Ref { } } - public static final class LongRef { + public static final class LongRef implements Serializable { public long element; @Override @@ -64,7 +66,7 @@ public class Ref { } } - public static final class FloatRef { + public static final class FloatRef implements Serializable { public float element; @Override @@ -73,7 +75,7 @@ public class Ref { } } - public static final class DoubleRef { + public static final class DoubleRef implements Serializable { public double element; @Override @@ -82,7 +84,7 @@ public class Ref { } } - public static final class CharRef { + public static final class CharRef implements Serializable { public char element; @Override @@ -91,7 +93,7 @@ public class Ref { } } - public static final class BooleanRef { + public static final class BooleanRef implements Serializable { public boolean element; @Override diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index e9444d4b348..4ccfa3d8576 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -4284,6 +4284,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("refsAreSerializable.kt") + public void testRefsAreSerializable() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/refsAreSerializable.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } + @TestMetadata("simplestClosure.kt") public void testSimplestClosure() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt"); diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt index 15daa370f40..390208f8998 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt @@ -759,55 +759,55 @@ public class kotlin/jvm/internal/PropertyReference2Impl : kotlin/jvm/internal/Pr public class kotlin/jvm/internal/Ref { } -public final class kotlin/jvm/internal/Ref$BooleanRef { +public final class kotlin/jvm/internal/Ref$BooleanRef : java/io/Serializable { public field element Z public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$ByteRef { +public final class kotlin/jvm/internal/Ref$ByteRef : java/io/Serializable { public field element B public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$CharRef { +public final class kotlin/jvm/internal/Ref$CharRef : java/io/Serializable { public field element C public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$DoubleRef { +public final class kotlin/jvm/internal/Ref$DoubleRef : java/io/Serializable { public field element D public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$FloatRef { +public final class kotlin/jvm/internal/Ref$FloatRef : java/io/Serializable { public field element F public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$IntRef { +public final class kotlin/jvm/internal/Ref$IntRef : java/io/Serializable { public field element I public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$LongRef { +public final class kotlin/jvm/internal/Ref$LongRef : java/io/Serializable { public field element J public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$ObjectRef { +public final class kotlin/jvm/internal/Ref$ObjectRef : java/io/Serializable { public field element Ljava/lang/Object; public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$ShortRef { +public final class kotlin/jvm/internal/Ref$ShortRef : java/io/Serializable { public field element S public fun ()V public fun toString ()Ljava/lang/String; diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 8c2bce9d82f..def71a7d4d2 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -2754,55 +2754,55 @@ public class kotlin/jvm/internal/PropertyReference2Impl : kotlin/jvm/internal/Pr public class kotlin/jvm/internal/Ref { } -public final class kotlin/jvm/internal/Ref$BooleanRef { +public final class kotlin/jvm/internal/Ref$BooleanRef : java/io/Serializable { public field element Z public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$ByteRef { +public final class kotlin/jvm/internal/Ref$ByteRef : java/io/Serializable { public field element B public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$CharRef { +public final class kotlin/jvm/internal/Ref$CharRef : java/io/Serializable { public field element C public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$DoubleRef { +public final class kotlin/jvm/internal/Ref$DoubleRef : java/io/Serializable { public field element D public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$FloatRef { +public final class kotlin/jvm/internal/Ref$FloatRef : java/io/Serializable { public field element F public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$IntRef { +public final class kotlin/jvm/internal/Ref$IntRef : java/io/Serializable { public field element I public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$LongRef { +public final class kotlin/jvm/internal/Ref$LongRef : java/io/Serializable { public field element J public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$ObjectRef { +public final class kotlin/jvm/internal/Ref$ObjectRef : java/io/Serializable { public field element Ljava/lang/Object; public fun ()V public fun toString ()Ljava/lang/String; } -public final class kotlin/jvm/internal/Ref$ShortRef { +public final class kotlin/jvm/internal/Ref$ShortRef : java/io/Serializable { public field element S public fun ()V public fun toString ()Ljava/lang/String;