@@ -825,7 +825,10 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
825825 val paramNameAccess = new Array [Int ](paramCount)
826826 var i = 0
827827 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+ }
829832 paramNameAccess(i) = u2
830833 i += 1
831834 }
@@ -1248,6 +1251,7 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
12481251 sym setInfo createFromClonedSymbols(alias.initialize.typeParams, alias.tpe)(typeFun)
12491252 }
12501253 }
1254+ // on JDK 21+, `names` may include nulls, as per scala/bug#12783
12511255 private class ParamNames (val names : Array [NameOrString ], val access : Array [Int ]) {
12521256 assert(names.length == access.length)
12531257 def length = names.length
@@ -1351,8 +1355,10 @@ abstract class ClassfileParser(reader: ReusableInstance[ReusableDataReader]) {
13511355 case (i, param) =>
13521356 val isSynthetic = (paramNames.access(i) & ACC_SYNTHETIC ) != 0
13531357 if (! isSynthetic) {
1354- param.name = paramNames.names(i).name.toTermName.encode
13551358 param.resetFlag(SYNTHETIC )
1359+ val nameOrString = paramNames.names(i)
1360+ if (nameOrString != null )
1361+ param.name = nameOrString.name.toTermName.encode
13561362 }
13571363 }
13581364 // there's not anything we can do, but it's slightly worrisome
0 commit comments