RFR: 8303431: [JVMCI] libgraal annotation API [v6]
Andrey Turbanov
aturbanov at openjdk.org
Fri Mar 17 14:57:44 UTC 2023
On Tue, 14 Mar 2023 16:06:06 GMT, Doug Simon <dnsimon at openjdk.org> wrote:
>> This PR extends JVMCI with new API (`jdk.vm.ci.meta.Annotated`) for accessing annotations. The main differences from `java.lang.reflect.AnnotatedElement` are:
>> * All methods in the `Annotated` interface explicitly specify requested annotation type(s). That is, there is no equivalent of `AnnotatedElement.getAnnotations()`.
>> * Annotation data is returned in a map-like object (of type `jdk.vm.ci.meta.AnnotationData`) instead of in an `Annotation` object. This works better for libgraal as it avoids the need for annotation types to be loaded and included in libgraal.
>>
>> To demonstrate the new API, here's an example in terms `java.lang.reflect.AnnotatedElement` (which `ResolvedJavaType` implements):
>>
>> ResolvedJavaMethod method = ...;
>> ExplodeLoop a = method.getAnnotation(ExplodeLoop.class);
>> return switch (a.kind()) {
>> case FULL_UNROLL -> LoopExplosionKind.FULL_UNROLL;
>> case FULL_UNROLL_UNTIL_RETURN -> LoopExplosionKind.FULL_UNROLL_UNTIL_RETURN;
>> ...
>> }
>>
>>
>> The same code using the new API:
>>
>>
>> ResolvedJavaMethod method = ...;
>> ResolvedJavaType explodeLoopType = ...;
>> AnnotationData a = method.getAnnotationDataFor(explodeLoopType);
>> return switch (a.getEnum("kind").getName()) {
>> case "FULL_UNROLL" -> LoopExplosionKind.FULL_UNROLL;
>> case "FULL_UNROLL_UNTIL_RETURN" -> LoopExplosionKind.FULL_UNROLL_UNTIL_RETURN;
>> ...
>> }
>>
>>
>> The implementation relies on new methods in `jdk.internal.vm.VMSupport` for parsing annotations and serializing/deserializing to/from a byte array. This allows the annotation data to be passed from the HotSpot heap to the libgraal heap.
>
> Doug Simon has updated the pull request incrementally with one additional commit since the last revision:
>
> addressed review feedback
src/java.base/share/classes/jdk/internal/vm/VMSupport.java line 237:
> 235: try {
> 236: ByteArrayOutputStream baos = new ByteArrayOutputStream(128);
> 237: try(DataOutputStream dos = new DataOutputStream(baos)) {
nit
Suggestion:
try (DataOutputStream dos = new DataOutputStream(baos)) {
src/java.base/share/classes/jdk/internal/vm/VMSupport.java line 564:
> 562: } else if (length <= 127) {
> 563: dos.writeByte((byte) (0x80 | length));
> 564: } else {
nit
Suggestion:
} else {
-------------
PR: https://git.openjdk.org/jdk/pull/12810
More information about the core-libs-dev
mailing list