classfile: model RuntimeVisible/InvisibleParameterAnnotations (fixes ASM AIOOBE on write)

Parameter annotations were unmodeled and fell through to Raw with stale
constant-pool indices after the pool rebuild. ASM (Paper converter, Fabric
mixin transformer) then failed with ArrayIndexOutOfBoundsException in
readParameterAnnotations. Now parsed and rewritten like class-level
annotations.
This commit is contained in:
Loki 2026-10-12 13:19:12 +02:00
parent 045cd3ed9c
commit b73c72d56d
Signed by: boba
GPG key ID: 253067914055423B
5 changed files with 80 additions and 1 deletions

View file

@ -12,6 +12,13 @@ pub(super) fn rewrite_annotations(annotations: &mut [Annotation], maps: &RenameM
}
}
/// Per-parameter annotation lists (`RuntimeVisibleParameterAnnotations`).
pub(super) fn rewrite_parameter_annotations(params: &mut [Vec<Annotation>], maps: &RenameMaps) {
for param in params.iter_mut() {
rewrite_annotations(param, maps);
}
}
fn rewrite_annotation(anno: &mut Annotation, maps: &RenameMaps) {
anno.descriptor = rewrite_descriptor(&anno.descriptor, &maps.classes);
for (_, value) in anno.elements.iter_mut() {

View file

@ -3,7 +3,7 @@
mod annotations;
mod code;
use annotations::rewrite_annotations;
use annotations::{rewrite_annotations, rewrite_parameter_annotations};
use noxis_classfile::{Attribute, ClassFile, Const, StackMapFrame, VerificationType};
use noxis_core::{Config, Context};
@ -147,6 +147,10 @@ fn rewrite_attributes(
| Attribute::RuntimeInvisibleAnnotations(annos) => {
rewrite_annotations(annos, maps);
}
Attribute::RuntimeVisibleParameterAnnotations(params)
| Attribute::RuntimeInvisibleParameterAnnotations(params) => {
rewrite_parameter_annotations(params, maps);
}
Attribute::BootstrapMethods(methods) => {
for bsm in methods.iter_mut() {
rewrite_method_ref(&mut bsm.owner, &mut bsm.name, &mut bsm.descriptor, maps);