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); 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") @TestMetadata("simplestClosure.kt")
public void testSimplestClosure() throws Exception { public void testSimplestClosure() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt");
@@ -3617,6 +3617,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest(fileName); 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") @TestMetadata("simplestClosure.kt")
public void testSimplestClosure() throws Exception { public void testSimplestClosure() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt"); String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt");
@@ -16,10 +16,12 @@
package kotlin.jvm.internal; package kotlin.jvm.internal;
import java.io.Serializable;
public class Ref { public class Ref {
private Ref() {} private Ref() {}
public static final class ObjectRef<T> { public static final class ObjectRef<T> implements Serializable {
public T element; public T element;
@Override @Override
@@ -28,7 +30,7 @@ public class Ref {
} }
} }
public static final class ByteRef { public static final class ByteRef implements Serializable {
public byte element; public byte element;
@Override @Override
@@ -37,7 +39,7 @@ public class Ref {
} }
} }
public static final class ShortRef { public static final class ShortRef implements Serializable {
public short element; public short element;
@Override @Override
@@ -46,7 +48,7 @@ public class Ref {
} }
} }
public static final class IntRef { public static final class IntRef implements Serializable {
public int element; public int element;
@Override @Override
@@ -55,7 +57,7 @@ public class Ref {
} }
} }
public static final class LongRef { public static final class LongRef implements Serializable {
public long element; public long element;
@Override @Override
@@ -64,7 +66,7 @@ public class Ref {
} }
} }
public static final class FloatRef { public static final class FloatRef implements Serializable {
public float element; public float element;
@Override @Override
@@ -73,7 +75,7 @@ public class Ref {
} }
} }
public static final class DoubleRef { public static final class DoubleRef implements Serializable {
public double element; public double element;
@Override @Override
@@ -82,7 +84,7 @@ public class Ref {
} }
} }
public static final class CharRef { public static final class CharRef implements Serializable {
public char element; public char element;
@Override @Override
@@ -91,7 +93,7 @@ public class Ref {
} }
} }
public static final class BooleanRef { public static final class BooleanRef implements Serializable {
public boolean element; public boolean element;
@Override @Override
@@ -4284,6 +4284,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
doTest(fileName); 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") @TestMetadata("simplestClosure.kt")
public void testSimplestClosure() throws Exception { public void testSimplestClosure() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/closures/simplestClosure.kt"); 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 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 field element Z
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element B
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element C
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element D
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element F
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element I
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element J
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element Ljava/lang/Object;
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element S
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 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 field element Z
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element B
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element C
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element D
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element F
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element I
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element J
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element Ljava/lang/Object;
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; 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 field element S
public fun <init> ()V public fun <init> ()V
public fun toString ()Ljava/lang/String; public fun toString ()Ljava/lang/String;