25using System.Collections.Generic;
29#if IMPORTER || EXPORTER
35using System.Reflection;
36using System.Reflection.Emit;
46 sealed partial class RuntimeManagedJavaType
49 sealed partial class EnumEnumJavaType : FakeJavaType
52 readonly
Type fakeType;
60 internal EnumEnumJavaType(RuntimeContext context,
string name,
Type enumType) :
63#if IMPORTER || EXPORTER
64 this.fakeType = context.FakeTypes.GetEnumType(enumType);
66 this.fakeType = typeof(ikvm.@
internal.EnumEnum<>).MakeGenericType(enumType);
70#if !IMPORTER && !EXPORTER && !FIRST_PASS
72 internal object GetUnspecifiedValue()
74 return GetFieldWrapper(
"__unspecified", this.SigName).GetValue(
null);
79 sealed class EnumJavaField : RuntimeJavaField
82#if !IMPORTER && !EXPORTER
95 internal EnumJavaField(RuntimeJavaType tw,
string name,
int ordinal) :
98#if !IMPORTER && !EXPORTER
99 this.ordinal = ordinal;
103#if !IMPORTER && !EXPORTER && !FIRST_PASS
105 internal override object GetValue(
object obj)
108 System.Threading.Interlocked.CompareExchange(
ref val, Activator.CreateInstance(
this.DeclaringType.TypeAsTBD, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance,
null,
new object[] { this.Name, ordinal },
null),
null);
113 internal override void SetValue(
object obj,
object value)
121 protected override void EmitGetImpl(CodeEmitter ilgen)
123 var typeofByteCodeHelper = DeclaringType.Context.
Resolver.ResolveRuntimeType(
"IKVM.Runtime.ByteCodeHelper").AsReflection();
124 ilgen.Emit(OpCodes.Ldstr,
Name);
125 ilgen.Emit(OpCodes.Call, typeofByteCodeHelper.GetMethod(
"GetDotNetEnumField").MakeGenericMethod(DeclaringType.TypeAsBaseType));
128 protected override void EmitSetImpl(CodeEmitter ilgen)
130 throw new NotImplementedException();
137 sealed class EnumValuesJavaMethod : RuntimeJavaMethod
144 internal EnumValuesJavaMethod(RuntimeJavaType declaringType) :
150 internal override bool IsDynamicOnly =>
true;
152#if !IMPORTER && !FIRST_PASS && !EXPORTER
154 internal override object Invoke(
object obj,
object[] args)
156 RuntimeJavaField[] values = this.DeclaringType.GetFields();
157 object[] array = (
object[])Array.CreateInstance(
this.DeclaringType.TypeAsArrayType, values.Length);
158 for (
int i = 0; i < values.Length; i++)
160 array[i] = values[i].GetValue(
null);
169 protected override void LazyPublishMembers()
171 var fields =
new List<RuntimeJavaField>();
173 foreach (var field
in DeclaringTypeWrapper.TypeAsTBD.GetFields(BindingFlags.Static | BindingFlags.Public))
175 fields.Add(
new EnumJavaField(
this, field.Name, ordinal++));
178 fields.Add(
new EnumJavaField(
this,
"__unspecified", ordinal++));
179 SetFields(fields.ToArray());
180 SetMethods(
new RuntimeJavaMethod[] {
new EnumValuesJavaMethod(
this),
new EnumValueOfJavaMethod(
this) });
181 base.LazyPublishMembers();
184 internal override RuntimeJavaType DeclaringTypeWrapper => Context.ClassLoaderFactory.GetJavaTypeFromType(fakeType.GetGenericArguments()[0]);
186 internal override RuntimeClassLoader ClassLoader => DeclaringTypeWrapper.ClassLoader;
188 internal override Type TypeAsTBD => fakeType;
190 internal override bool IsFastClassLiteralSafe =>
true;
IKVM.Reflection.Type Type
global::java.lang.invoke.LambdaForm.Name Name
ISymbolResolver Resolver
Gets the ISymbolResolver associated with this instance of the runtime.
MemberFlags
Describes various options applied to a member.