We have room for a free bool, so it makes more sense to only get the __<clinit> method when we really need to (and not trigger a LazyPublishMembers).

This commit is contained in:
jfrijters 2009-12-07 05:54:04 +00:00
Родитель d7f31faced
Коммит 44efece100
1 изменённых файлов: 7 добавлений и 6 удалений

Просмотреть файл

@ -3797,6 +3797,7 @@ namespace IKVM.Internal
private TypeWrapper[] interfaces; private TypeWrapper[] interfaces;
private TypeWrapper[] innerclasses; private TypeWrapper[] innerclasses;
private MethodInfo clinitMethod; private MethodInfo clinitMethod;
private bool clinitMethodSet;
private Modifiers reflectiveModifiers; private Modifiers reflectiveModifiers;
internal static CompiledTypeWrapper newInstance(string name, Type type) internal static CompiledTypeWrapper newInstance(string name, Type type)
@ -4108,8 +4109,11 @@ namespace IKVM.Internal
{ {
get get
{ {
// trigger LazyPublishMembers if(!clinitMethodSet)
GetMethods(); {
clinitMethod = type.GetMethod("__<clinit>", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
clinitMethodSet = true;
}
return clinitMethod != null; return clinitMethod != null;
} }
} }
@ -4434,7 +4438,6 @@ namespace IKVM.Internal
protected override void LazyPublishMembers() protected override void LazyPublishMembers()
{ {
bool isDelegate = type.BaseType == Types.MulticastDelegate; bool isDelegate = type.BaseType == Types.MulticastDelegate;
clinitMethod = type.GetMethod("__<clinit>", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
List<MethodWrapper> methods = new List<MethodWrapper>(); List<MethodWrapper> methods = new List<MethodWrapper>();
List<FieldWrapper> fields = new List<FieldWrapper>(); List<FieldWrapper> fields = new List<FieldWrapper>();
MemberInfo[] members = type.GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); MemberInfo[] members = type.GetMembers(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
@ -4698,9 +4701,7 @@ namespace IKVM.Internal
internal override void EmitRunClassConstructor(CodeEmitter ilgen) internal override void EmitRunClassConstructor(CodeEmitter ilgen)
{ {
// trigger LazyPublishMembers if(HasStaticInitializer)
GetMethods();
if(clinitMethod != null)
{ {
ilgen.Emit(OpCodes.Call, clinitMethod); ilgen.Emit(OpCodes.Call, clinitMethod);
} }