Make Ref classes for shared vars Serializable

#KT-14566 Fixed
This commit is contained in:
Alexander Udalov
2017-02-09 20:34:04 +03:00
parent c10524586a
commit 8e3cb912c7
8 changed files with 91 additions and 27 deletions
@@ -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()
}
@@ -0,0 +1,4 @@
@kotlin.Metadata
public final class RefsAreSerializableKt {
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
}
@@ -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");
@@ -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");
@@ -16,10 +16,12 @@
package kotlin.jvm.internal;
import java.io.Serializable;
public class Ref {
private Ref() {}
public static final class ObjectRef<T> {
public static final class ObjectRef<T> 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
@@ -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");
@@ -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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()V
public fun toString ()Ljava/lang/String;
@@ -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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()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 <init> ()V
public fun toString ()Ljava/lang/String;