SI-8931 make generic signature consistent with interface list in classfiles#4080
Conversation
7134259 to
dca78a4
Compare
|
Hmm, that what I get for testing on quick without building locker... |
41f461d to
cc1c3f6
Compare
|
Here is the diff for scala-library.jar for this change: https://gist.github.com/gourlaysama/91e2d23ec1b60a9a186e (collections and tuples are the most affected). It isn't incredibly readable, but it helps. |
|
Review @retronym :) |
|
There's still duplication in the new backend (totally not your fault..!): https://github.com/scala/scala/blob/2.11.x/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala#L202 Can you also use |
|
Looks good otherwise! |
cc1c3f6 to
a329917
Compare
|
@lrytz done. Thanks, I had completely overlooked that. |
There was a problem hiding this comment.
I would actually write this test as a run test that uses Java reflection to extract the list of generic interfaces. Furthermore, by setting up the classes in a self contained manner in the test, the intent is clearer.
scala> trait B; trait A extends B; class C extends A with B
defined trait B
defined trait A
defined class C
scala> classOf[C].getGenericInterfaces
res2: Array[java.lang.reflect.Type] = Array(interface A)In the test, you would just need:
trait B; trait A extends B; class C extends A with B
object Test extends App {
println(classOf[C].getGenericInterfaces.toList)
}…sfiles An optimization was introduced in 7a99c03 (SI-5278) to remove redundant interfaces from the list of implemented interfaces in the bytecode. However the same change was not propagated to the generic signature of a class, which also contains a list of direct parent classes and interfaces. The JVM does not check the well-formedness of signatures at class loading or linking (see §4.3.4 of jdk7 jvms), but other tools might assume the number of implemented interfaces is the same whether one asked for generic or erased interfaces. It doesn't break reflection so nobody complained, but it does show: scala> val c = classOf[Tuple1[String]] c: Class[(String,)] = class scala.Tuple1 scala> c.getInterfaces // Product is gone res0: Array[Class[_]] = Array(interface scala.Product1, interface scala.Serializable) scala> c.getGenericInterfaces // Product is back! res1: Array[java.lang.reflect.Type] = Array(scala.Product1<T1>, interface scala.Product, interface scala.Serializable) This moves the optimization to erasure, for use in emitting the generic signature, and the backend calls into it later for the list of interfaces.
a329917 to
ced3ca8
Compare
|
PLS REBUILD/pr-scala@ced3ca8 |
|
(kitty-note-to-self: ignore 61896124) |
|
LGTM! |
…ces-2 SI-8931 make generic signature consistent with interface list in classfiles
An optimization was introduced in 7a99c03 (SI-5278) to remove redundant
interfaces from the list of implemented interfaces in the bytecode.
However the same change was not propagated to the generic signature
of a class, which also contains a list of direct parent classes and
interfaces.
The JVM does not check the well-formedness of signatures at class
loading or linking (see §4.3.4 of jdk7 jvms), but other tools might
assume the number of implemented interfaces is the same whether one
asked for generic or erased interfaces.
It doesn't break reflection so nobody complained, but it does show:
This moves the optimization to erasure, for use in emitting the generic
signature, and the backend calls into it later for the list of
interfaces.