60 throw new ArgumentException(
"LoadAssemblyCustomAttribute did not receive any definitions.");
62 throw new InternalException(
"LoadAssemblyCustomAttribute did not receive AnnotationDefaultAttribute.TAG_ANNOTATION.");
64 var annotationClass = (string)def[1];
70 return loader.RetTypeWrapperFromSig(annotationClass.Replace(
'/',
'.'),
LoadMode.LoadOrThrow).Annotation;
87 internal static Annotation Load(RuntimeJavaType owner,
object[] def)
91 var annotationClass = (string)def[1];
93 if (!annotationClass.EndsWith(
"$Annotation;") && !annotationClass.EndsWith(
"$Annotation$__ReturnValue;") && !annotationClass.EndsWith(
"$Annotation$__Multiple;"))
103 var tw = owner.ClassLoader.RetTypeWrapperFromSig(annotationClass.Replace(
'/',
'.'),
LoadMode.Link);
106 if (!tw.IsUnloadable && tw.IsAccessibleFrom(owner))
108 return tw.Annotation;
122 private static object LookupEnumValue(
RuntimeContext context,
Type enumType,
string value)
124 FieldInfo field = enumType.GetField(value, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
127 return field.GetRawConstantValue();
135 if (targetType.IsEnum)
140 object[] arr = (
object[])obj;
142 for (
int i = 1; i < arr.Length; i++)
145 string s = ((
object[])arr[i])[2].ToString();
146 object newval = LookupEnumValue(loader.
Context, targetType, s);
160 string s = ((
object[])obj)[2].ToString();
161 if (s ==
"__unspecified")
165 return LookupEnumValue(loader.
Context, targetType, s);
171 return loader.FieldTypeWrapperFromSig(((
string)((
object[])obj)[1]).Replace(
'/',
'.'),
LoadMode.LoadOrThrow).TypeAsTBD;
173 else if (targetType.IsArray)
176 object[] arr = (
object[])obj;
177 Type elementType = targetType.GetElementType();
178 object[] targetArray =
new object[arr.Length - 1];
179 for (
int i = 1; i < arr.Length; i++)
181 targetArray[i - 1] =
ConvertValue(loader, elementType, arr[i]);
191 internal static bool HasRetentionPolicyRuntime(
object[] annotations)
193 if (annotations !=
null)
195 foreach (
object[] def
in annotations)
197 if (def[1].Equals(
"Ljava/lang/annotation/Retention;"))
199 for (
int i = 2; i < def.Length; i += 2)
201 if (def[i].Equals(
"value"))
203 object[] val = def[i + 1] as
object[];
207 && val[1].Equals(
"Ljava/lang/annotation/RetentionPolicy;")
208 && val[2].Equals(
"RUNTIME"))
221 internal static bool HasObsoleteAttribute(
object[] annotations)
223 if (annotations !=
null)
225 foreach (
object[] def
in annotations)
227 if (def[1].Equals(
"Lcli/System/ObsoleteAttribute$Annotation;"))
240 object[] def = (
object[])annotation;
241 for (
int i = 3; i < def.Length; i += 2)
243 object[] val = def[i] as
object[];
246 object[] newval = ValueQualifyClassNames(loader, val);
252 object[] newdef =
new object[def.Length];
253 Array.Copy(def, newdef, def.Length);
271 var sig = (string)val[1];
272 if (sig.StartsWith(
"L", StringComparison.Ordinal))
274 var tw = loader.TryLoadClassByName(sig.Substring(1, sig.Length - 2).Replace(
'/',
'.'));
282 var sig = (string)val[1];
283 var tw = loader.TryLoadClassByName(sig.Substring(1, sig.Length - 2).Replace(
'/',
'.'));
292 for (
int i = 1; i < val.Length; i++)
294 if (val[i] is
object[] nval)
296 var newnval = ValueQualifyClassNames(loader, nval);
302 var newval =
new object[val.Length];
303 Array.Copy(val, newval, val.Length);
320 throw new InvalidOperationException();
324 internal abstract void Apply(RuntimeClassLoader loader, TypeBuilder tb,
object annotation);
325 internal abstract void Apply(RuntimeClassLoader loader, MethodBuilder mb,
object annotation);
326 internal abstract void Apply(RuntimeClassLoader loader, FieldBuilder fb,
object annotation);
327 internal abstract void Apply(RuntimeClassLoader loader, ParameterBuilder pb,
object annotation);
328 internal abstract void Apply(RuntimeClassLoader loader, AssemblyBuilder ab,
object annotation);
329 internal abstract void Apply(RuntimeClassLoader loader, PropertyBuilder pb,
object annotation);
331 internal virtual void ApplyReturnValue(RuntimeClassLoader loader, MethodBuilder mb,
ref ParameterBuilder pb,
object annotation)
336 internal abstract bool IsCustomAttribute {
get; }
Maintains services relevant to an instane of the IKVM runtime.
Types Types
Gets the Types associated with this instance of the runtime.
ISymbolResolver Resolver
Gets the ISymbolResolver associated with this instance of the runtime.