|
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