[Ikvm-commit] ikvm/reflect ConstructorInfo.cs, 1.6, 1.7 CustomAttributeData.cs, 1.22, 1.23 MemberIn
Brought to you by:
jfrijters
From: Jeroen F. <jfr...@us...> - 2011-01-26 07:00:05
|
Update of /cvsroot/ikvm/ikvm/reflect In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv18483 Modified Files: ConstructorInfo.cs CustomAttributeData.cs MemberInfo.cs Missing.cs Type.cs Log Message: Added support for resolving methods in missing types (primarily to enable CustomAttributeData.Constructor to work for missing attribute types). Index: Missing.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/reflect/Missing.cs,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** Missing.cs 20 Jan 2011 14:31:10 -0000 1.9 --- Missing.cs 26 Jan 2011 06:59:57 -0000 1.10 *************** *** 23,26 **** --- 23,27 ---- */ using System; + using System.Text; using System.Collections.Generic; using System.Runtime.InteropServices; *************** *** 351,354 **** --- 352,365 ---- } + internal override MethodBase FindMethod(string name, MethodSignature signature) + { + MethodInfo method = new MissingMethod(this, name, signature); + if (name == ".ctor") + { + return new ConstructorInfoImpl(method); + } + return method; + } + internal override Type FindNestedType(TypeName name) { *************** *** 356,359 **** --- 367,375 ---- } + public override bool __IsMissing + { + get { return true; } + } + public override Type DeclaringType { *************** *** 481,483 **** --- 497,672 ---- } } + + sealed class MissingMethod : MethodInfo + { + private readonly Type declaringType; + private readonly string name; + private readonly MethodSignature signature; + + internal MissingMethod(Type declaringType, string name, MethodSignature signature) + { + this.declaringType = declaringType; + this.name = name; + this.signature = signature; + } + + public override bool __IsMissing + { + get { return true; } + } + + public override Type ReturnType + { + get { return signature.GetReturnType(this); } + } + + public override ParameterInfo ReturnParameter + { + get { return new ParameterInfoImpl(this, -1); } + } + + internal override MethodSignature MethodSignature + { + get { return signature; } + } + + internal override int ParameterCount + { + get { throw new MissingMemberException(this); } + } + + private sealed class ParameterInfoImpl : ParameterInfo + { + private readonly MissingMethod method; + private readonly int index; + + internal ParameterInfoImpl(MissingMethod method, int index) + { + this.method = method; + this.index = index; + } + + public override string Name + { + get { throw new MissingMemberException(method); } + } + + public override Type ParameterType + { + get { return index == -1 ? method.signature.GetReturnType(method) : method.signature.GetParameterType(method, index); } + } + + public override ParameterAttributes Attributes + { + get { throw new MissingMemberException(method); } + } + + public override int Position + { + get { return index; } + } + + public override object RawDefaultValue + { + get { throw new MissingMemberException(method); } + } + + public override Type[] GetOptionalCustomModifiers() + { + if (index == -1) + { + return Util.Copy(method.signature.GetReturnTypeOptionalCustomModifiers(method)); + } + return Util.Copy(method.signature.GetParameterOptionalCustomModifiers(method, index)); + } + + public override Type[] GetRequiredCustomModifiers() + { + if (index == -1) + { + return Util.Copy(method.signature.GetReturnTypeRequiredCustomModifiers(method)); + } + return Util.Copy(method.signature.GetParameterRequiredCustomModifiers(method, index)); + } + + public override MemberInfo Member + { + get { return method; } + } + + public override int MetadataToken + { + get { throw new MissingMemberException(method); } + } + + internal override Module Module + { + get { return method.Module; } + } + } + + public override ParameterInfo[] GetParameters() + { + ParameterInfoImpl[] parameters = new ParameterInfoImpl[signature.GetParameterCount()]; + for (int i = 0; i < parameters.Length; i++) + { + parameters[i] = new ParameterInfoImpl(this, i); + } + return parameters; + } + + public override MethodAttributes Attributes + { + get { throw new MissingMemberException(this); } + } + + public override MethodImplAttributes GetMethodImplementationFlags() + { + throw new MissingMemberException(this); + } + + public override MethodBody GetMethodBody() + { + throw new MissingMemberException(this); + } + + public override CallingConventions CallingConvention + { + get { return signature.CallingConvention; } + } + + internal override int ImportTo(IKVM.Reflection.Emit.ModuleBuilder module) + { + throw new MissingMemberException(this); + } + + public override string Name + { + get { return name; } + } + + public override Type DeclaringType + { + get { return declaringType.IsModulePseudoType ? null : declaringType; } + } + + public override Module Module + { + get { return declaringType.Module; } + } + + public override bool Equals(object obj) + { + MissingMethod other = obj as MissingMethod; + return other != null + && other.declaringType == declaringType + && other.name == name + && other.signature.Equals(signature); + } + + public override int GetHashCode() + { + return declaringType.GetHashCode() ^ name.GetHashCode() ^ signature.GetHashCode(); + } + } } Index: MemberInfo.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/reflect/MemberInfo.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** MemberInfo.cs 13 Jan 2011 05:58:54 -0000 1.6 --- MemberInfo.cs 26 Jan 2011 06:59:57 -0000 1.7 *************** *** 53,56 **** --- 53,61 ---- } + public virtual bool __IsMissing + { + get { return false; } + } + public bool IsDefined(Type attributeType, bool inherit) { Index: CustomAttributeData.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/reflect/CustomAttributeData.cs,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -d -r1.22 -r1.23 *** CustomAttributeData.cs 13 Jan 2011 15:44:28 -0000 1.22 --- CustomAttributeData.cs 26 Jan 2011 06:59:57 -0000 1.23 *************** *** 382,420 **** } ! public bool __TryReadTypeName(out string ns, out string name) { - if (lazyConstructor == null) - { - ModuleReader mod = module as ModuleReader; - if (mod != null) - { - // Note that we only need to manually handle the MemberRef case here, - // because a MethodDef will result in a lazy MethodInfo object being returned - // when the constructor is resolved, so we can safely do that without - // triggering an assembly load. - int methodToken = mod.CustomAttribute.records[index].Type; - if ((methodToken >> 24) == MemberRefTable.Index) - { - int methodIndex = (methodToken & 0xFFFFFF) - 1; - int typeToken = mod.MemberRef.records[methodIndex].Class; - if ((typeToken >> 24) == TypeRefTable.Index) - { - int typeIndex = (typeToken & 0xFFFFFF) - 1; - if ((mod.TypeRef.records[typeIndex].ResolutionScope >> 24) == TypeRefTable.Index) - { - // nested types can't be represented using only a namespace and name, - // so we fail - ns = null; - name = null; - return false; - } - int typeNameSpace = mod.TypeRef.records[typeIndex].TypeNameSpace; - ns = typeNameSpace == 0 ? null : mod.GetString(typeNameSpace); - name = mod.GetString(mod.TypeRef.records[typeIndex].TypeName); - return true; - } - } - } - } if (Constructor.DeclaringType.IsNested) { --- 382,388 ---- } ! [Obsolete("Use Constructor.DeclaringType instead.")] ! internal bool __TryReadTypeName(out string ns, out string name) { if (Constructor.DeclaringType.IsNested) { *************** *** 428,431 **** --- 396,405 ---- } + // for use by mcs + internal byte[] __GetBlob() + { + return ((ModuleReader)module).GetBlobCopy(module.CustomAttribute.records[index].Value); + } + public ConstructorInfo Constructor { Index: ConstructorInfo.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/reflect/ConstructorInfo.cs,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ConstructorInfo.cs 13 Jan 2011 05:58:54 -0000 1.6 --- ConstructorInfo.cs 26 Jan 2011 06:59:57 -0000 1.7 *************** *** 202,205 **** --- 202,210 ---- } + public override bool __IsMissing + { + get { return method.__IsMissing; } + } + internal override MethodInfo GetMethodInfo() { Index: Type.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/reflect/Type.cs,v retrieving revision 1.40 retrieving revision 1.41 diff -C2 -d -r1.40 -r1.41 *** Type.cs 23 Jan 2011 08:12:13 -0000 1.40 --- Type.cs 26 Jan 2011 06:59:57 -0000 1.41 *************** *** 1137,1145 **** } - public bool __IsMissing - { - get { return this is MissingType; } - } - public virtual bool __ContainsMissingType { --- 1137,1140 ---- *************** *** 1526,1530 **** } ! internal MethodBase FindMethod(string name, MethodSignature signature) { foreach (MethodBase method in __GetDeclaredMethods()) --- 1521,1525 ---- } ! internal virtual MethodBase FindMethod(string name, MethodSignature signature) { foreach (MethodBase method in __GetDeclaredMethods()) |