@@ -825,7 +825,10 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
825
825
val paramNameAccess = new Array [Int ](paramCount)
826
826
var i = 0
827
827
while (i < paramCount) {
828
- paramNames(i) = pool.getExternalName(u2)
828
+ paramNames(i) = u2() match {
829
+ case 0 => null // may occur on JDK 21+, as per scala/bug#12783
830
+ case index => pool.getExternalName(index)
831
+ }
829
832
paramNameAccess(i) = u2
830
833
i += 1
831
834
}
@@ -1248,6 +1251,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1248
1251
sym setInfo createFromClonedSymbols(alias.initialize.typeParams, alias.tpe)(typeFun)
1249
1252
}
1250
1253
}
1254
+ // on JDK 21+, `names` may include nulls, as per scala/bug#12783
1251
1255
private class ParamNames (val names : Array [NameOrString ], val access : Array [Int ]) {
1252
1256
assert(names.length == access.length)
1253
1257
def length = names.length
@@ -1351,8 +1355,10 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
1351
1355
case (i, param) =>
1352
1356
val isSynthetic = (paramNames.access(i) & ACC_SYNTHETIC ) != 0
1353
1357
if (! isSynthetic) {
1354
- param.name = paramNames.names(i).name.toTermName.encode
1355
1358
param.resetFlag(SYNTHETIC )
1359
+ val nameOrString = paramNames.names(i)
1360
+ if (nameOrString != null )
1361
+ param.name = nameOrString.name.toTermName.encode
1356
1362
}
1357
1363
}
1358
1364
// there's not anything we can do, but it's slightly worrisome
0 commit comments