Skip to content

Commit 22f9ea1

Browse files
authored
Fix stackoverflow for scala traits (#9)
* Integration test for transitively Serializable objects * Fix StackoverflowError for scala traits * Up version to 1.4.1
1 parent aacf474 commit 22f9ea1

File tree

12 files changed

+53
-16
lines changed

12 files changed

+53
-16
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ The plugin adds `readResolve` method for every object which either:
1414
1515
// plugins dsl
1616
plugins {
17-
id "me.shika.kotlin-object-java-serialization" version "1.4.0"
17+
id "me.shika.kotlin-object-java-serialization" version "1.4.1"
1818
}
1919
2020
// or else
@@ -25,7 +25,7 @@ buildscript {
2525
}
2626
}
2727
dependencies {
28-
classpath "me.shika:kotlin-object-java-serialization:1.4.0"
28+
classpath "me.shika:kotlin-object-java-serialization:1.4.1"
2929
}
3030
}
3131

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ allprojects {
1313
}
1414

1515
group 'me.shika'
16-
version '1.4.0'
16+
version '1.4.1'
1717
}

gradle-plugin/src/main/kotlin/me/shika/ObjectSerializationPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class ObjectSerializationPlugin : KotlinCompilerPluginSupportPlugin {
3636
SubpluginArtifact(
3737
groupId = "me.shika",
3838
artifactId = "kotlin-object-java-serialization",
39-
version = "1.4.0"
39+
version = "1.4.1"
4040
)
4141

4242
override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean =

integration-test/build.gradle

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
apply plugin: "org.jetbrains.kotlin.jvm"
1+
plugins {
2+
id 'org.jetbrains.kotlin.jvm'
3+
}
24

35
dependencies {
46
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
7+
implementation project('scala-module')
58
testImplementation 'junit:junit:4.12'
69

710
kotlinCompilerPluginClasspath project(':kotlin-plugin')
8-
}
11+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
plugins {
2+
id 'scala'
3+
id 'java-library'
4+
}
5+
6+
dependencies {
7+
api 'org.scala-lang:scala-library:2.12.17'
8+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
trait NotSerializableTrait
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
trait SerializableTrait extends Serializable
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
object SerializableFromScala: SerializableTrait
2+
3+
object NotSerializableFromScala: NotSerializableTrait
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import java.io.Serializable
2+
3+
interface TestInterface: Serializable
4+
5+
object DirectlyImplementsTestInterface: TestInterface
6+
7+
abstract class ExtendsTestInterface: TestInterface
8+
9+
object IndirectlyImplementsTestInterface: ExtendsTestInterface()
10+
11+
object NotSerializable
Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
1-
import org.junit.Assert.assertEquals
1+
import org.junit.Assert.assertSame
22
import org.junit.Test
3-
import java.io.ByteArrayInputStream
4-
import java.io.ByteArrayOutputStream
5-
import java.io.ObjectInputStream
6-
import java.io.ObjectOutputStream
7-
import java.io.Serializable
3+
import java.io.*
84

95
class ObjectSerializationIntegrationTest {
106
@Test
117
fun `object instance is the same after deserialization`() {
12-
assertEquals(TestObject, serializeDeserialize(TestObject))
8+
assertSame(TestObject, serializeDeserialize(TestObject))
9+
assertSame(DirectlyImplementsTestInterface, serializeDeserialize(DirectlyImplementsTestInterface))
10+
assertSame(IndirectlyImplementsTestInterface, serializeDeserialize(IndirectlyImplementsTestInterface))
11+
assertSame(SerializableFromScala, serializeDeserialize(SerializableFromScala))
1312
}
1413

15-
private fun serializeDeserialize(instance: Serializable): Serializable {
14+
@Test(expected = NotSerializableException::class)
15+
fun `cannot serialize non-serializable object`() {
16+
serializeDeserialize(NotSerializable)
17+
}
18+
19+
@Test(expected = NotSerializableException::class)
20+
fun `cannot serialize non-serializable object from scala`() {
21+
serializeDeserialize(NotSerializableFromScala)
22+
}
23+
24+
private fun serializeDeserialize(instance: Any): Any? {
1625
val outputStream = ByteArrayOutputStream()
1726
ObjectOutputStream(outputStream).use {
1827
it.writeObject(instance)
1928
}
2029
return ObjectInputStream(ByteArrayInputStream(outputStream.toByteArray())).use {
21-
it.readObject() as TestObject
30+
it.readObject()
2231
}
2332
}
2433
}

kotlin-plugin/src/main/kotlin/me/shika/generation/utils.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fun IrClass.needSerializableFix(): Boolean {
4040

4141
fun IrClass.isSerializable(): Boolean {
4242
return allSuperInterfaces()
43-
.any { it.fqNameWhenAvailable == SERIALIZABLE_FQ_NAME || it.isSerializable() }
43+
.any { it.fqNameWhenAvailable == SERIALIZABLE_FQ_NAME || it !== this && it.isSerializable() }
4444
|| getAllSuperclasses().any { it.isSerializable() }
4545
}
4646

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ rootProject.name = 'kotlin-object-java-serialization'
33
include ':gradle-plugin'
44
include ':kotlin-plugin'
55
include ':integration-test'
6+
include ':integration-test:scala-module'

0 commit comments

Comments
 (0)