Skip to content

Commit 3fd456d

Browse files
committed
Fix #7319: Properly support @serialversionuid
We need to emit a static `serialVersionUID` field when this annotation is used, but we were missing the logic in DottyBackendInterface to actually retrieve the value of the annotation. I also updated BCodeHelpers to emit the field as private like scalac does since scala/scala@7f20b1c
1 parent 71234eb commit 3fd456d

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeHelpers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ trait BCodeHelpers extends BCodeIdiomatic with BytecodeWriters {
421421
def addSerialVUID(id: Long, jclass: asm.ClassVisitor): Unit = {
422422
// add static serialVersionUID field if `clasz` annotated with `@SerialVersionUID(uid: Long)`
423423
jclass.visitField(
424-
GenBCodeOps.PublicStaticFinal,
424+
GenBCodeOps.PrivateStaticFinal,
425425
"serialVersionUID",
426426
"J",
427427
null, // no java-generic-signature

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,8 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
791791
}
792792
def methodSymbols: List[Symbol] =
793793
for (f <- toDenot(sym).info.decls.toList if f.isMethod && f.isTerm && !f.isModule) yield f
794-
def serialVUID: Option[Long] = None
795-
794+
def serialVUID: Option[Long] =
795+
sym.getAnnotation(defn.SerialVersionUIDAnnot).flatMap(_.argumentConstant(0).map(_.longValue))
796796

797797
def freshLocal(cunit: CompilationUnit, name: String, tpe: Type, pos: Position, flags: Flags): Symbol = {
798798
ctx.newSymbol(sym, name.toTermName, termFlagSet(flags), tpe, NoSymbol, pos)

compiler/src/dotty/tools/backend/jvm/GenBCodeOps.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ class GenBCodeOps {
1111

1212
final val PublicStatic = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC
1313
final val PublicStaticFinal = asm.Opcodes.ACC_PUBLIC | asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_FINAL
14+
final val PrivateStaticFinal = asm.Opcodes.ACC_PRIVATE | asm.Opcodes.ACC_STATIC | asm.Opcodes.ACC_FINAL
1415
}

tests/run/t8549b.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import java.lang.reflect.Modifier._
2+
3+
@SerialVersionUID(42)
4+
class C extends Serializable
5+
6+
@SerialVersionUID(43 - 1)
7+
class D extends Serializable
8+
9+
10+
object Test extends App {
11+
def checkId(cls: Class[_]): Unit = {
12+
val field = cls.getDeclaredField("serialVersionUID")
13+
assert(isPrivate(field.getModifiers))
14+
field.setAccessible(true)
15+
val id = field.get(null).asInstanceOf[Long]
16+
assert(id == 42, (cls, id))
17+
}
18+
checkId(classOf[C])
19+
checkId(classOf[D])
20+
}

0 commit comments

Comments
 (0)