+ void initAnnotationProxyField (int proxyRef, FieldInfo fi, Object v) throws ClinitRequired {
+ String fname = fi.getName();
+ String ftype = fi.getType();
+
+ if (v instanceof String){
+ setReferenceField(proxyRef, fname, newString((String)v));
+ } else if (v instanceof Boolean){
+ setBooleanField(proxyRef, fname, ((Boolean)v).booleanValue());
+ } else if (v instanceof Integer){
+ setIntField(proxyRef, fname, ((Integer)v).intValue());
+ } else if (v instanceof Long){
+ setLongField(proxyRef, fname, ((Long)v).longValue());
+ } else if (v instanceof Float){
+ setFloatField(proxyRef, fname, ((Float)v).floatValue());
+ } else if (v instanceof Short){
+ setShortField(proxyRef, fname, ((Short)v).shortValue());
+ } else if (v instanceof Character){
+ setCharField(proxyRef, fname, ((Character)v).charValue());
+ } else if (v instanceof Byte){
+ setByteField(proxyRef, fname, ((Byte)v).byteValue());
+ } else if (v instanceof Double){
+ setDoubleField(proxyRef, fname, ((Double)v).doubleValue());
+ } else {
+ Optional<Integer> ref = liftAnnotationReferenceValue(v, ftype);
+ if(ref.isPresent()) {
+ setReferenceField(proxyRef, fname, ref.get());
+ } else {
+ throwException("java.lang.InternalError", "AnnotationElement type not supported: " + ftype);
+ }
+ }
+ }
+
+ private int makeAnnotationEnumRef(AnnotationInfo.EnumValue v) {
+ AnnotationInfo.EnumValue ev = (AnnotationInfo.EnumValue)v;
+ String eCls = ev.getEnumClassName();
+ String eConst = ev.getEnumConstName();
+
+ ClassInfo eci = ClassLoaderInfo.getCurrentResolvedClassInfo(eCls);
+ if (!eci.isInitialized()){
+ throw new ClinitRequired(eci);
+ }
+
+ StaticElementInfo sei = eci.getStaticElementInfo();
+ int eref = sei.getReferenceField(eConst);
+ return eref;
+ }
+