Skip to content

Commit 1df17bb

Browse files
committed
Avoid overeager completion of annotations in classfile parser
1 parent be65db4 commit 1df17bb

File tree

5 files changed

+31
-9
lines changed

5 files changed

+31
-9
lines changed

compiler/src/dotty/tools/dotc/core/Definitions.scala

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -961,13 +961,9 @@ class Definitions {
961961
@tu lazy val NativeAnnot: ClassSymbol = requiredClass("scala.native")
962962
@tu lazy val RepeatedAnnot: ClassSymbol = requiredClass("scala.annotation.internal.Repeated")
963963
@tu lazy val SourceFileAnnot: ClassSymbol = requiredClass("scala.annotation.internal.SourceFile")
964-
@tu lazy val ScalaSignatureAnnot: ClassSymbol = requiredClass("scala.reflect.ScalaSignature")
965-
@tu lazy val ScalaLongSignatureAnnot: ClassSymbol = requiredClass("scala.reflect.ScalaLongSignature")
966964
@tu lazy val ScalaStrictFPAnnot: ClassSymbol = requiredClass("scala.annotation.strictfp")
967965
@tu lazy val ScalaStaticAnnot: ClassSymbol = requiredClass("scala.annotation.static")
968966
@tu lazy val SerialVersionUIDAnnot: ClassSymbol = requiredClass("scala.SerialVersionUID")
969-
@tu lazy val TASTYSignatureAnnot: ClassSymbol = requiredClass("scala.annotation.internal.TASTYSignature")
970-
@tu lazy val TASTYLongSignatureAnnot: ClassSymbol = requiredClass("scala.annotation.internal.TASTYLongSignature")
971967
@tu lazy val TailrecAnnot: ClassSymbol = requiredClass("scala.annotation.tailrec")
972968
@tu lazy val ThreadUnsafeAnnot: ClassSymbol = requiredClass("scala.annotation.threadUnsafe")
973969
@tu lazy val ConstructorOnlyAnnot: ClassSymbol = requiredClass("scala.annotation.constructorOnly")

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ object ClassfileParser {
5151
mapOver(tp)
5252
}
5353
}
54+
55+
private inline def sigOfClassName(n: String) = s"L$n;"
56+
val ScalaSignatureAnnot: String = sigOfClassName("scala.reflect.ScalaSignature")
57+
val ScalaLongSignatureAnnot: String = sigOfClassName("scala.reflect.ScalaLongSignature")
58+
val TASTYSignatureAnnot: String = sigOfClassName("scala.annotation.internal.TASTYSignature")
59+
val TASTYLongSignatureAnnot: String = sigOfClassName("scala.annotation.internal.TASTYLongSignature")
5460
}
5561

5662
class ClassfileParser(
@@ -1033,19 +1039,19 @@ class ClassfileParser(
10331039
val nAnnots = in.nextChar
10341040
var i = 0
10351041
while (i < nAnnots) {
1036-
val attrClass = pool.getType(in.nextChar).typeSymbol
1042+
val attrSig = pool.getExternalName(in.nextChar).value
10371043
val nArgs = in.nextChar
10381044
var j = 0
10391045
while (j < nArgs) {
10401046
val argName = pool.getName(in.nextChar)
10411047
if (argName.name == nme.bytes) {
1042-
if (attrClass == defn.ScalaSignatureAnnot)
1048+
if attrSig == ScalaSignatureAnnot then
10431049
return unpickleScala(parseScalaSigBytes)
1044-
else if (attrClass == defn.ScalaLongSignatureAnnot)
1050+
else if attrSig == ScalaLongSignatureAnnot then
10451051
return unpickleScala(parseScalaLongSigBytes)
1046-
else if (attrClass == defn.TASTYSignatureAnnot)
1052+
else if attrSig == TASTYSignatureAnnot then
10471053
return unpickleTASTY(parseScalaSigBytes)
1048-
else if (attrClass == defn.TASTYLongSignatureAnnot)
1054+
else if attrSig == TASTYLongSignatureAnnot then
10491055
return unpickleTASTY(parseScalaLongSigBytes)
10501056
}
10511057
parseAnnotArg(skip = true)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java.lang.annotation.Retention;
2+
import java.lang.annotation.RetentionPolicy;
3+
4+
@InterfaceStability_JAVA_ONLY_1.Evolving(bytes="no")
5+
public class InterfaceAudience_JAVA_ONLY_1 {
6+
@Retention(RetentionPolicy.RUNTIME)
7+
public @interface Public { String bytes(); }
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import java.lang.annotation.Retention;
2+
import java.lang.annotation.RetentionPolicy;
3+
4+
@InterfaceAudience_JAVA_ONLY_1.Public(bytes="yes")
5+
public class InterfaceStability_JAVA_ONLY_1 {
6+
@Retention(RetentionPolicy.RUNTIME)
7+
public @interface Evolving { String bytes(); }
8+
}

tests/pos/i15166/Test_2.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// scalac: -Xfatal-warnings
2+
object Test {
3+
val x: InterfaceAudience_JAVA_ONLY_1.Public = ???
4+
}

0 commit comments

Comments
 (0)