Skip to content

Commit 21392e2

Browse files
committed
Exception proxy support
1 parent 73d065a commit 21392e2

File tree

3 files changed

+145
-45
lines changed

3 files changed

+145
-45
lines changed

substratevm/src/com.oracle.svm.reflect/src/com/oracle/svm/reflect/hosted/AnnotationEncoder.java

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,44 +25,45 @@
2525
package com.oracle.svm.reflect.hosted;
2626

2727
import java.util.function.Consumer;
28-
import java.util.function.Function;
2928

3029
import org.graalvm.compiler.core.common.util.UnsafeArrayTypeWriter;
3130
import org.graalvm.compiler.debug.GraalError;
3231

32+
import com.oracle.svm.core.code.CodeInfoEncoder.Encoders;
3333
import com.oracle.svm.util.SubstrateAnnotationExtracter.AnnotationMemberValue;
3434
import com.oracle.svm.util.SubstrateAnnotationExtracter.AnnotationValue;
3535
import com.oracle.svm.util.SubstrateAnnotationExtracter.ArrayValue;
3636
import com.oracle.svm.util.SubstrateAnnotationExtracter.ClassValue;
3737
import com.oracle.svm.util.SubstrateAnnotationExtracter.EnumValue;
38+
import com.oracle.svm.util.SubstrateAnnotationExtracter.ExceptionProxyValue;
3839
import com.oracle.svm.util.SubstrateAnnotationExtracter.PrimitiveValue;
3940
import com.oracle.svm.util.SubstrateAnnotationExtracter.StringValue;
4041
import com.oracle.svm.util.SubstrateAnnotationExtracter.TypeAnnotationValue;
4142

4243
public class AnnotationEncoder {
43-
static void encodeAnnotation(UnsafeArrayTypeWriter buf, AnnotationValue value, Function<Class<?>, Integer> classEncoder, Function<String, Integer> stringEncoder) {
44-
buf.putS4(classEncoder.apply(value.getType()));
44+
static void encodeAnnotation(UnsafeArrayTypeWriter buf, AnnotationValue value, Encoders encoders) {
45+
buf.putS4(encoders.sourceClasses.getIndex(value.getType()));
4546
buf.putU2(value.getMemberCount());
4647
value.forEachMember((memberName, memberValue) -> {
47-
buf.putS4(stringEncoder.apply(memberName));
48-
encodeAnnotationMember(buf, memberValue, classEncoder, stringEncoder);
48+
buf.putS4(encoders.sourceMethodNames.getIndex(memberName));
49+
encodeAnnotationMember(buf, memberValue, encoders);
4950
});
5051
}
5152

52-
static void encodeAnnotationMember(UnsafeArrayTypeWriter buf, AnnotationMemberValue memberValue, Function<Class<?>, Integer> classEncoder, Function<String, Integer> stringEncoder) {
53+
static void encodeAnnotationMember(UnsafeArrayTypeWriter buf, AnnotationMemberValue memberValue, Encoders encoders) {
5354
buf.putU1(memberValue.getTag());
5455
if (memberValue instanceof AnnotationValue) {
55-
encodeAnnotation(buf, (AnnotationValue) memberValue, classEncoder, stringEncoder);
56+
encodeAnnotation(buf, (AnnotationValue) memberValue, encoders);
5657
} else if (memberValue instanceof ClassValue) {
57-
buf.putS4(classEncoder.apply(((ClassValue) memberValue).getValue()));
58+
buf.putS4(encoders.sourceClasses.getIndex(((ClassValue) memberValue).getValue()));
5859
} else if (memberValue instanceof EnumValue) {
59-
buf.putS4(classEncoder.apply(((EnumValue) memberValue).getType()));
60-
buf.putS4(stringEncoder.apply(((EnumValue) memberValue).getName()));
60+
buf.putS4(encoders.sourceClasses.getIndex(((EnumValue) memberValue).getType()));
61+
buf.putS4(encoders.sourceMethodNames.getIndex(((EnumValue) memberValue).getName()));
6162
} else if (memberValue instanceof StringValue) {
62-
buf.putS4(stringEncoder.apply(((StringValue) memberValue).getValue()));
63+
buf.putS4(encoders.sourceMethodNames.getIndex(((StringValue) memberValue).getValue()));
6364
} else if (memberValue instanceof ArrayValue) {
6465
buf.putU2(((ArrayValue) memberValue).getElementCount());
65-
((ArrayValue) memberValue).forEachElement(element -> encodeAnnotationMember(buf, element, classEncoder, stringEncoder));
66+
((ArrayValue) memberValue).forEachElement(element -> encodeAnnotationMember(buf, element, encoders));
6667
} else if (memberValue instanceof PrimitiveValue) {
6768
Object value = ((PrimitiveValue) memberValue).getValue();
6869
switch (memberValue.getTag()) {
@@ -93,19 +94,21 @@ static void encodeAnnotationMember(UnsafeArrayTypeWriter buf, AnnotationMemberVa
9394
default:
9495
throw GraalError.shouldNotReachHere("Invalid annotation encoding");
9596
}
97+
} else if (memberValue instanceof ExceptionProxyValue) {
98+
buf.putS4(encoders.objectConstants.getIndex(((ExceptionProxyValue) memberValue).getObjectConstant()));
9699
} else {
97100
throw GraalError.shouldNotReachHere("Invalid annotation member type: " + memberValue.getClass());
98101
}
99102
}
100103

101-
static void encodeTypeAnnotation(UnsafeArrayTypeWriter buf, TypeAnnotationValue value, Function<Class<?>, Integer> classEncoder, Function<String, Integer> stringEncoder) {
104+
static void encodeTypeAnnotation(UnsafeArrayTypeWriter buf, TypeAnnotationValue value, Encoders encoders) {
102105
for (byte b : value.getTargetInfo()) {
103106
buf.putU1(b);
104107
}
105108
for (byte b : value.getLocationInfo()) {
106109
buf.putU1(b);
107110
}
108-
encodeAnnotation(buf, value.getAnnotationData(), classEncoder, stringEncoder);
111+
encodeAnnotation(buf, value.getAnnotationData(), encoders);
109112
}
110113

111114
static <T> void encodeArray(UnsafeArrayTypeWriter buf, T[] elements, Consumer<T> encoder) {

substratevm/src/com.oracle.svm.reflect/src/com/oracle/svm/reflect/hosted/ReflectionMetadataEncoderImpl.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import java.util.function.BiConsumer;
5252
import java.util.function.Consumer;
5353

54-
import com.oracle.graal.pointsto.infrastructure.WrappedElement;
5554
import org.graalvm.compiler.core.common.util.TypeConversion;
5655
import org.graalvm.compiler.core.common.util.UnsafeArrayTypeWriter;
5756
import org.graalvm.compiler.debug.GraalError;
@@ -60,6 +59,7 @@
6059
import org.graalvm.nativeimage.impl.RuntimeReflectionSupport;
6160
import org.graalvm.util.GuardedAnnotationAccess;
6261

62+
import com.oracle.graal.pointsto.infrastructure.WrappedElement;
6363
import com.oracle.graal.pointsto.meta.AnalysisField;
6464
import com.oracle.graal.pointsto.meta.AnalysisMethod;
6565
import com.oracle.graal.pointsto.meta.AnalysisType;
@@ -94,11 +94,13 @@
9494
import com.oracle.svm.util.SubstrateAnnotationExtracter;
9595
import com.oracle.svm.util.SubstrateAnnotationExtracter.AnnotationMemberValue;
9696
import com.oracle.svm.util.SubstrateAnnotationExtracter.AnnotationValue;
97+
import com.oracle.svm.util.SubstrateAnnotationExtracter.ExceptionProxyValue;
9798
import com.oracle.svm.util.SubstrateAnnotationExtracter.TypeAnnotationValue;
9899

99100
import jdk.internal.reflect.Reflection;
100101
import jdk.vm.ci.meta.JavaConstant;
101102
import jdk.vm.ci.meta.MetaAccessProvider;
103+
import sun.reflect.annotation.ExceptionProxy;
102104

103105
/**
104106
* The reflection metadata encoder creates metadata for reflection objects (classes, fields, methods
@@ -132,6 +134,7 @@ public ReflectionMetadataEncoder create(CodeInfoEncoder.Encoders encoders) {
132134

133135
private final CodeInfoEncoder.Encoders encoders;
134136
private final ReflectionDataAccessors accessors;
137+
private final Map<ExceptionProxy, JavaConstant> annotationExceptionProxies = new HashMap<>();
135138
private final ReflectionDataBuilder dataBuilder;
136139
private final TreeSet<HostedType> sortedTypes = new TreeSet<>(Comparator.comparingLong(t -> t.getHub().getTypeID()));
137140
private final Map<HostedType, ClassMetadata> classData = new HashMap<>();
@@ -484,6 +487,13 @@ private void registerValues(AnnotationMemberValue annotationValue) {
484487
for (String string : annotationValue.getStrings()) {
485488
encoders.sourceMethodNames.addObject(string);
486489
}
490+
if (annotationValue instanceof ExceptionProxyValue) {
491+
ExceptionProxyValue exceptionProxy = (ExceptionProxyValue) annotationValue;
492+
JavaConstant javaConstant = annotationExceptionProxies.computeIfAbsent(exceptionProxy.getExceptionProxy(),
493+
(ignored) -> SubstrateObjectConstant.forObject(exceptionProxy.getExceptionProxy()));
494+
encoders.objectConstants.addObject(javaConstant);
495+
exceptionProxy.setObjectConstant(javaConstant);
496+
}
487497
}
488498

489499
private ReflectParameterMetadata[] registerReflectParameters(Executable executable) {
@@ -905,7 +915,7 @@ public byte[] encodeAnnotations(AnnotationValue[] annotations) {
905915
return null;
906916
}
907917
UnsafeArrayTypeWriter buf = UnsafeArrayTypeWriter.create(ByteArrayReader.supportsUnalignedMemoryAccess(), true);
908-
AnnotationEncoder.encodeArray(buf, annotations, annotation -> AnnotationEncoder.encodeAnnotation(buf, annotation, encoders.sourceClasses::getIndex, encoders.sourceMethodNames::getIndex));
918+
AnnotationEncoder.encodeArray(buf, annotations, annotation -> AnnotationEncoder.encodeAnnotation(buf, annotation, encoders));
909919
return buf.toArray();
910920
}
911921

@@ -916,7 +926,7 @@ private byte[] encodeParameterAnnotations(AnnotationValue[][] parameterAnnotatio
916926
UnsafeArrayTypeWriter buf = UnsafeArrayTypeWriter.create(ByteArrayReader.supportsUnalignedMemoryAccess(), true);
917927
buf.putU1(parameterAnnotations.length);
918928
for (AnnotationValue[] annotations : parameterAnnotations) {
919-
AnnotationEncoder.encodeArray(buf, annotations, annotation -> AnnotationEncoder.encodeAnnotation(buf, annotation, encoders.sourceClasses::getIndex, encoders.sourceMethodNames::getIndex));
929+
AnnotationEncoder.encodeArray(buf, annotations, annotation -> AnnotationEncoder.encodeAnnotation(buf, annotation, encoders));
920930
}
921931
return buf.toArray();
922932
}
@@ -926,7 +936,7 @@ private byte[] encodeAnnotationDefault(AnnotationMemberValue annotationDefault)
926936
return null;
927937
}
928938
UnsafeArrayTypeWriter buf = UnsafeArrayTypeWriter.create(ByteArrayReader.supportsUnalignedMemoryAccess(), true);
929-
AnnotationEncoder.encodeAnnotationMember(buf, annotationDefault, encoders.sourceClasses::getIndex, encoders.sourceMethodNames::getIndex);
939+
AnnotationEncoder.encodeAnnotationMember(buf, annotationDefault, encoders);
930940
return buf.toArray();
931941
}
932942

@@ -936,7 +946,7 @@ public byte[] encodeTypeAnnotations(TypeAnnotationValue[] typeAnnotations) {
936946
}
937947
UnsafeArrayTypeWriter buf = UnsafeArrayTypeWriter.create(ByteArrayReader.supportsUnalignedMemoryAccess(), true);
938948
AnnotationEncoder.encodeArray(buf, typeAnnotations,
939-
typeAnnotation -> AnnotationEncoder.encodeTypeAnnotation(buf, typeAnnotation, encoders.sourceClasses::getIndex, encoders.sourceMethodNames::getIndex));
949+
typeAnnotation -> AnnotationEncoder.encodeTypeAnnotation(buf, typeAnnotation, encoders));
940950
return buf.toArray();
941951
}
942952

0 commit comments

Comments
 (0)