Skip to content

Commit 8e3cb91

Browse files
committed
Make Ref classes for shared vars Serializable
#KT-14566 Fixed
1 parent c105245 commit 8e3cb91

File tree

8 files changed

+91
-27
lines changed

8 files changed

+91
-27
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// IGNORE_BACKEND: JS
2+
3+
import java.io.*
4+
5+
fun box(): String {
6+
var o = ""
7+
var b = 0.toByte()
8+
var d = 0.0
9+
var f = 0.0f
10+
var i = 0
11+
var j = 0L
12+
var s = 0.toShort()
13+
var c = '0'
14+
var z = false
15+
16+
val lambda = fun(): String {
17+
o = "OK"
18+
b++; d++; f++; i++; j++; s++; c++
19+
z = true
20+
return o
21+
}
22+
23+
val baos = ByteArrayOutputStream()
24+
val oos = ObjectOutputStream(baos)
25+
oos.writeObject(lambda)
26+
oos.close()
27+
28+
val bais = ByteArrayInputStream(baos.toByteArray())
29+
val ois = ObjectInputStream(bais)
30+
val result = ois.readObject() as () -> String
31+
ois.close()
32+
33+
return result()
34+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
@kotlin.Metadata
2+
public final class RefsAreSerializableKt {
3+
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
4+
}

compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3617,6 +3617,12 @@ public void testRecursiveClosure() throws Exception {
36173617
doTest(fileName);
36183618
}
36193619

3620+
@TestMetadata("refsAreSerializable.kt")
3621+
public void testRefsAreSerializable() throws Exception {
3622+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/refsAreSerializable.kt");
3623+
doTest(fileName);
3624+
}
3625+
36203626
@TestMetadata("simplestClosure.kt")
36213627
public void testSimplestClosure() throws Exception {
36223628
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt");

compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3617,6 +3617,12 @@ public void testRecursiveClosure() throws Exception {
36173617
doTest(fileName);
36183618
}
36193619

3620+
@TestMetadata("refsAreSerializable.kt")
3621+
public void testRefsAreSerializable() throws Exception {
3622+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/refsAreSerializable.kt");
3623+
doTest(fileName);
3624+
}
3625+
36203626
@TestMetadata("simplestClosure.kt")
36213627
public void testSimplestClosure() throws Exception {
36223628
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt");

core/runtime.jvm/src/kotlin/jvm/internal/Ref.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@
1616

1717
package kotlin.jvm.internal;
1818

19+
import java.io.Serializable;
20+
1921
public class Ref {
2022
private Ref() {}
2123

22-
public static final class ObjectRef<T> {
24+
public static final class ObjectRef<T> implements Serializable {
2325
public T element;
2426

2527
@Override
@@ -28,7 +30,7 @@ public String toString() {
2830
}
2931
}
3032

31-
public static final class ByteRef {
33+
public static final class ByteRef implements Serializable {
3234
public byte element;
3335

3436
@Override
@@ -37,7 +39,7 @@ public String toString() {
3739
}
3840
}
3941

40-
public static final class ShortRef {
42+
public static final class ShortRef implements Serializable {
4143
public short element;
4244

4345
@Override
@@ -46,7 +48,7 @@ public String toString() {
4648
}
4749
}
4850

49-
public static final class IntRef {
51+
public static final class IntRef implements Serializable {
5052
public int element;
5153

5254
@Override
@@ -55,7 +57,7 @@ public String toString() {
5557
}
5658
}
5759

58-
public static final class LongRef {
60+
public static final class LongRef implements Serializable {
5961
public long element;
6062

6163
@Override
@@ -64,7 +66,7 @@ public String toString() {
6466
}
6567
}
6668

67-
public static final class FloatRef {
69+
public static final class FloatRef implements Serializable {
6870
public float element;
6971

7072
@Override
@@ -73,7 +75,7 @@ public String toString() {
7375
}
7476
}
7577

76-
public static final class DoubleRef {
78+
public static final class DoubleRef implements Serializable {
7779
public double element;
7880

7981
@Override
@@ -82,7 +84,7 @@ public String toString() {
8284
}
8385
}
8486

85-
public static final class CharRef {
87+
public static final class CharRef implements Serializable {
8688
public char element;
8789

8890
@Override
@@ -91,7 +93,7 @@ public String toString() {
9193
}
9294
}
9395

94-
public static final class BooleanRef {
96+
public static final class BooleanRef implements Serializable {
9597
public boolean element;
9698

9799
@Override

js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4284,6 +4284,18 @@ public void testRecursiveClosure() throws Exception {
42844284
doTest(fileName);
42854285
}
42864286

4287+
@TestMetadata("refsAreSerializable.kt")
4288+
public void testRefsAreSerializable() throws Exception {
4289+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/refsAreSerializable.kt");
4290+
try {
4291+
doTest(fileName);
4292+
}
4293+
catch (Throwable ignore) {
4294+
return;
4295+
}
4296+
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
4297+
}
4298+
42874299
@TestMetadata("simplestClosure.kt")
42884300
public void testSimplestClosure() throws Exception {
42894301
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt");

libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-runtime.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -759,55 +759,55 @@ public class kotlin/jvm/internal/PropertyReference2Impl : kotlin/jvm/internal/Pr
759759
public class kotlin/jvm/internal/Ref {
760760
}
761761

762-
public final class kotlin/jvm/internal/Ref$BooleanRef {
762+
public final class kotlin/jvm/internal/Ref$BooleanRef : java/io/Serializable {
763763
public field element Z
764764
public fun <init> ()V
765765
public fun toString ()Ljava/lang/String;
766766
}
767767

768-
public final class kotlin/jvm/internal/Ref$ByteRef {
768+
public final class kotlin/jvm/internal/Ref$ByteRef : java/io/Serializable {
769769
public field element B
770770
public fun <init> ()V
771771
public fun toString ()Ljava/lang/String;
772772
}
773773

774-
public final class kotlin/jvm/internal/Ref$CharRef {
774+
public final class kotlin/jvm/internal/Ref$CharRef : java/io/Serializable {
775775
public field element C
776776
public fun <init> ()V
777777
public fun toString ()Ljava/lang/String;
778778
}
779779

780-
public final class kotlin/jvm/internal/Ref$DoubleRef {
780+
public final class kotlin/jvm/internal/Ref$DoubleRef : java/io/Serializable {
781781
public field element D
782782
public fun <init> ()V
783783
public fun toString ()Ljava/lang/String;
784784
}
785785

786-
public final class kotlin/jvm/internal/Ref$FloatRef {
786+
public final class kotlin/jvm/internal/Ref$FloatRef : java/io/Serializable {
787787
public field element F
788788
public fun <init> ()V
789789
public fun toString ()Ljava/lang/String;
790790
}
791791

792-
public final class kotlin/jvm/internal/Ref$IntRef {
792+
public final class kotlin/jvm/internal/Ref$IntRef : java/io/Serializable {
793793
public field element I
794794
public fun <init> ()V
795795
public fun toString ()Ljava/lang/String;
796796
}
797797

798-
public final class kotlin/jvm/internal/Ref$LongRef {
798+
public final class kotlin/jvm/internal/Ref$LongRef : java/io/Serializable {
799799
public field element J
800800
public fun <init> ()V
801801
public fun toString ()Ljava/lang/String;
802802
}
803803

804-
public final class kotlin/jvm/internal/Ref$ObjectRef {
804+
public final class kotlin/jvm/internal/Ref$ObjectRef : java/io/Serializable {
805805
public field element Ljava/lang/Object;
806806
public fun <init> ()V
807807
public fun toString ()Ljava/lang/String;
808808
}
809809

810-
public final class kotlin/jvm/internal/Ref$ShortRef {
810+
public final class kotlin/jvm/internal/Ref$ShortRef : java/io/Serializable {
811811
public field element S
812812
public fun <init> ()V
813813
public fun toString ()Ljava/lang/String;

libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2754,55 +2754,55 @@ public class kotlin/jvm/internal/PropertyReference2Impl : kotlin/jvm/internal/Pr
27542754
public class kotlin/jvm/internal/Ref {
27552755
}
27562756

2757-
public final class kotlin/jvm/internal/Ref$BooleanRef {
2757+
public final class kotlin/jvm/internal/Ref$BooleanRef : java/io/Serializable {
27582758
public field element Z
27592759
public fun <init> ()V
27602760
public fun toString ()Ljava/lang/String;
27612761
}
27622762

2763-
public final class kotlin/jvm/internal/Ref$ByteRef {
2763+
public final class kotlin/jvm/internal/Ref$ByteRef : java/io/Serializable {
27642764
public field element B
27652765
public fun <init> ()V
27662766
public fun toString ()Ljava/lang/String;
27672767
}
27682768

2769-
public final class kotlin/jvm/internal/Ref$CharRef {
2769+
public final class kotlin/jvm/internal/Ref$CharRef : java/io/Serializable {
27702770
public field element C
27712771
public fun <init> ()V
27722772
public fun toString ()Ljava/lang/String;
27732773
}
27742774

2775-
public final class kotlin/jvm/internal/Ref$DoubleRef {
2775+
public final class kotlin/jvm/internal/Ref$DoubleRef : java/io/Serializable {
27762776
public field element D
27772777
public fun <init> ()V
27782778
public fun toString ()Ljava/lang/String;
27792779
}
27802780

2781-
public final class kotlin/jvm/internal/Ref$FloatRef {
2781+
public final class kotlin/jvm/internal/Ref$FloatRef : java/io/Serializable {
27822782
public field element F
27832783
public fun <init> ()V
27842784
public fun toString ()Ljava/lang/String;
27852785
}
27862786

2787-
public final class kotlin/jvm/internal/Ref$IntRef {
2787+
public final class kotlin/jvm/internal/Ref$IntRef : java/io/Serializable {
27882788
public field element I
27892789
public fun <init> ()V
27902790
public fun toString ()Ljava/lang/String;
27912791
}
27922792

2793-
public final class kotlin/jvm/internal/Ref$LongRef {
2793+
public final class kotlin/jvm/internal/Ref$LongRef : java/io/Serializable {
27942794
public field element J
27952795
public fun <init> ()V
27962796
public fun toString ()Ljava/lang/String;
27972797
}
27982798

2799-
public final class kotlin/jvm/internal/Ref$ObjectRef {
2799+
public final class kotlin/jvm/internal/Ref$ObjectRef : java/io/Serializable {
28002800
public field element Ljava/lang/Object;
28012801
public fun <init> ()V
28022802
public fun toString ()Ljava/lang/String;
28032803
}
28042804

2805-
public final class kotlin/jvm/internal/Ref$ShortRef {
2805+
public final class kotlin/jvm/internal/Ref$ShortRef : java/io/Serializable {
28062806
public field element S
28072807
public fun <init> ()V
28082808
public fun toString ()Ljava/lang/String;

0 commit comments

Comments
 (0)