@@ -840,7 +840,10 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
840
840
val paramNameAccess = new Array [Int ](paramCount)
841
841
var i = 0
842
842
while (i < paramCount) {
843
- paramNames(i) = pool.getExternalName(u2())
843
+ paramNames(i) = u2() match {
844
+ case 0 => null // may occur on JDK 21+, as per scala/bug#12783
845
+ case index => pool.getExternalName(index)
846
+ }
844
847
paramNameAccess(i) = u2()
845
848
i += 1
846
849
}
@@ -1358,6 +1361,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1358
1361
sym setInfo createFromClonedSymbols(alias.initialize.typeParams, alias.tpe)(typeFun)
1359
1362
}
1360
1363
}
1364
+ // on JDK 21+, `names` may include nulls, as per scala/bug#12783
1361
1365
private class ParamNames (val names : Array [NameOrString ], val access : Array [Int ]) {
1362
1366
assert(names.length == access.length, " Require as many names as access" )
1363
1367
def length = names.length
@@ -1462,8 +1466,10 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1462
1466
case (i, param) =>
1463
1467
val isSynthetic = (paramNames.access(i) & ACC_SYNTHETIC ) != 0
1464
1468
if (! isSynthetic) {
1465
- param.name = paramNames.names(i).name.toTermName.encode
1466
1469
param.resetFlag(SYNTHETIC )
1470
+ val nameOrString = paramNames.names(i)
1471
+ if (nameOrString != null )
1472
+ param.name = nameOrString.name.toTermName.encode
1467
1473
}
1468
1474
}
1469
1475
// there's not anything we can do, but it's slightly worrisome
0 commit comments