Skip to content

Commit bd10700

Browse files
committed
Add exceptions lazily
1 parent 6830412 commit bd10700

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

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

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,13 @@ class ClassfileParser(
234234
val member = newSymbol(
235235
getOwner(jflags), preName.name, sflags, completer,
236236
getPrivateWithin(jflags), coord = start)
237-
getScope(jflags).enter(member)
238237

239238
val pt = if sig.size == 1 then constantTagToType(sig(0)) else WildcardType
240239
val isVarargs = sflags.is(Flags.Method) && (jflags & JAVA_ACC_VARARGS) != 0
241240
completer.attrCompleter = parseAttributes(member, pt, isVarargs)
241+
242+
getScope(jflags).enter(member)
243+
242244
}
243245
else {
244246
in.nextChar // info
@@ -610,6 +612,7 @@ class ClassfileParser(
610612
}
611613

612614
abstract class AttributeCompleter {
615+
var exceptions: List[NameOrString] = Nil
613616
def complete(tp: Type)(using Context): Type
614617
}
615618

@@ -620,6 +623,10 @@ class ClassfileParser(
620623
val res = new AttributeCompleter {
621624
def complete(tp: Type)(using Context): Type = {
622625
val newType = if (typeUpdate.isEmpty) tp else typeUpdate.get
626+
exceptions.foreach { ex =>
627+
val cls = getClassSymbol(ex.name)
628+
sym.addAnnotation(ThrowsAnnotation(cls.asClass))
629+
}
623630
cook.apply(newType)
624631
}
625632
}
@@ -692,8 +699,8 @@ class ClassfileParser(
692699
val nClasses = in.nextChar
693700
for (n <- 0 until nClasses) {
694701
// FIXME: this performs an equivalent of getExceptionTypes instead of getGenericExceptionTypes (SI-7065)
695-
val cls = pool.getClassSymbol(in.nextChar.toInt)
696-
sym.addAnnotation(ThrowsAnnotation(cls.asClass))
702+
val cls = pool.getClassName(in.nextChar.toInt)
703+
res.exceptions ::= cls
697704
}
698705
}
699706

@@ -934,9 +941,9 @@ class ClassfileParser(
934941
if (innerIndex != 0 && outerIndex != 0 && nameIndex != 0) {
935942
val inner = pool.getClassName(innerIndex)
936943
val outer = pool.getClassName(outerIndex)
937-
val name = pool.getClassName(nameIndex)
944+
val name = pool.getName(nameIndex)
938945
val entry = InnerClassEntry(inner, outer, name, jflags)
939-
innerClasses(pool.getClassName(innerIndex).value) = entry
946+
innerClasses(inner.value) = entry
940947
}
941948
}
942949
}

0 commit comments

Comments
 (0)