|
27 | 27 |
|
28 | 28 | import java.lang.classfile.*; |
29 | 29 | import java.lang.classfile.attribute.ExceptionsAttribute; |
| 30 | +import java.lang.classfile.attribute.RuntimeVisibleAnnotationsAttribute; |
30 | 31 | import java.lang.classfile.attribute.SourceFileAttribute; |
31 | 32 | import java.lang.constant.ClassDesc; |
32 | 33 | import java.lang.constant.MethodTypeDesc; |
@@ -68,6 +69,9 @@ abstract class ClassSpecializer<T,K,S extends ClassSpecializer<T,K,S>.SpeciesDat |
68 | 69 |
|
69 | 70 | private static final ClassDesc CD_LambdaForm = ClassOrInterfaceDescImpl.ofValidated("Ljava/lang/invoke/LambdaForm;"); |
70 | 71 | private static final ClassDesc CD_BoundMethodHandle = ClassOrInterfaceDescImpl.ofValidated("Ljava/lang/invoke/BoundMethodHandle;"); |
| 72 | + private static final RuntimeVisibleAnnotationsAttribute STABLE_ANNOTATION = RuntimeVisibleAnnotationsAttribute.of( |
| 73 | + Annotation.of(ConstantUtils.referenceClassDesc(Stable.class)) |
| 74 | + ); |
71 | 75 |
|
72 | 76 | private final Class<T> topClass; |
73 | 77 | private final Class<K> keyType; |
@@ -615,15 +619,21 @@ Class<? extends T> generateConcreteSpeciesCode(String className, ClassSpecialize |
615 | 619 | byte[] generateConcreteSpeciesCodeFile(String className0, ClassSpecializer<T,K,S>.SpeciesData speciesData) { |
616 | 620 | final ClassDesc classDesc = ClassDesc.of(className0); |
617 | 621 | final ClassDesc superClassDesc = classDesc(speciesData.deriveSuperClass()); |
618 | | - return ClassFile.of().build(classDesc, new Consumer<ClassBuilder>() { |
| 622 | + return ClassFile.of().build(classDesc, new Consumer<>() { |
619 | 623 | @Override |
620 | 624 | public void accept(ClassBuilder clb) { |
621 | 625 | clb.withFlags(ACC_FINAL | ACC_SUPER) |
622 | 626 | .withSuperclass(superClassDesc) |
623 | 627 | .with(SourceFileAttribute.of(classDesc.displayName())) |
624 | 628 |
|
625 | 629 | // emit static types and BMH_SPECIES fields |
626 | | - .withField(sdFieldName, CD_SPECIES_DATA, ACC_STATIC); |
| 630 | + .withField(sdFieldName, CD_SPECIES_DATA, new Consumer<>() { |
| 631 | + @Override |
| 632 | + public void accept(FieldBuilder fb) { |
| 633 | + fb.withFlags(ACC_STATIC) |
| 634 | + .with(STABLE_ANNOTATION); |
| 635 | + } |
| 636 | + }); |
627 | 637 |
|
628 | 638 | // handy holder for dealing with groups of typed values (ctor arguments and fields) |
629 | 639 | class Var { |
|
0 commit comments