diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala index 0e0d0428b..51d075947 100644 --- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala +++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala @@ -49,6 +49,8 @@ abstract class CleanUp extends Transform { private var localTyper: analyzer.Typer = null + private val serialIFace = definitions.getClass("java.io.Serializable") + private def classConstantMethod(pos: Position, sig: String): Symbol = classConstantMeth.get(sig) match { case Some(meth) => meth @@ -747,7 +749,7 @@ abstract class CleanUp extends Transform { // reference types must be marked as such. isValueType(typeSym) || typeSym.hasAttribute(SerializableAttr) || - (m.info.baseClasses exists { bc => bc hasAttribute SerializableAttr }) + (m.info.baseClasses exists { bc => (bc hasAttribute SerializableAttr) || (bc == serialIFace) }) } } diff --git a/test/files/jvm/t1143-2.check b/test/files/jvm/t1143-2.check new file mode 100644 index 000000000..2ae28399f --- /dev/null +++ b/test/files/jvm/t1143-2.check @@ -0,0 +1 @@ +pass diff --git a/test/files/jvm/t1143-2/Marker.java b/test/files/jvm/t1143-2/Marker.java new file mode 100644 index 000000000..e9ac045b8 --- /dev/null +++ b/test/files/jvm/t1143-2/Marker.java @@ -0,0 +1,4 @@ +import java.io.Serializable; + +public interface Marker extends Serializable { +} diff --git a/test/files/jvm/t1143-2/t1143-2.scala b/test/files/jvm/t1143-2/t1143-2.scala new file mode 100644 index 000000000..58bc1d763 --- /dev/null +++ b/test/files/jvm/t1143-2/t1143-2.scala @@ -0,0 +1,66 @@ +object Serialize { + @throws(classOf[java.io.IOException]) + def write[A](o: A): Array[Byte] = { + val ba = new java.io.ByteArrayOutputStream(512) + val out = new java.io.ObjectOutputStream(ba) + out.writeObject(o) + out.close() + ba.toByteArray() + } + @throws(classOf[java.io.IOException]) + @throws(classOf[ClassNotFoundException]) + def read[A](buffer: Array[Byte]): A = { + val in = + new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(buffer)) + in.readObject().asInstanceOf[A] + } +} + +@serializable +@SerialVersionUID(1L) +class VarModel[T]( getter: => T, setter: T => Unit ) +{ + Serialize.write(getter) + Serialize.write(setter) + + def this( getter: => T ) = this( getter, null ) + + def getObject: AnyRef = getter.asInstanceOf[AnyRef] + + def setObject( v: AnyRef ) = { + if( setter==null ) + throw new RuntimeException( "Tried to set readonly model!") + setter( v.asInstanceOf[T] ) + } + + def detach = () +} + +@serializable +@SerialVersionUID(1L) +class Printer( p: VarModel[String] ) { + def print = println( p.getObject ); +} + +class Component extends Marker { } + +class Form extends Component { } + +@serializable +@SerialVersionUID(1L) +class Main { + var pass = "pass" + def main(args : Array[String]) : Unit = { + val f = new Form { + val p = new Printer( new VarModel( pass, pass=_ ) ); + p.print + } + () + } +} + +object Test { + def main(args: Array[String]) { + (new Main).main(Array[String]()) + } +}