Skip to content

Commit 52ce4b1

Browse files
committed
ClassfileParser: allow missing param names (for JDK 21)
fixes scala/bug#12783
1 parent 2f2d4c6 commit 52ce4b1

1 file changed

Lines changed: 8 additions & 2 deletions

File tree

src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)