Update to the latest IKVM
authorMarek Safar <marek.safar@gmail.com>
Mon, 14 Feb 2011 12:18:58 +0000 (12:18 +0000)
committerMarek Safar <marek.safar@gmail.com>
Mon, 14 Feb 2011 12:18:58 +0000 (12:18 +0000)
16 files changed:
mcs/class/IKVM.Reflection/CustomAttributeData.cs
mcs/class/IKVM.Reflection/Emit/ConstructorBuilder.cs
mcs/class/IKVM.Reflection/Emit/EnumBuilder.cs
mcs/class/IKVM.Reflection/Emit/MethodBuilder.cs
mcs/class/IKVM.Reflection/Emit/TypeBuilder.cs
mcs/class/IKVM.Reflection/MethodSignature.cs
mcs/class/IKVM.Reflection/Missing.cs
mcs/class/IKVM.Reflection/Reader/GenericTypeParameter.cs
mcs/class/IKVM.Reflection/Reader/MetadataReader.cs
mcs/class/IKVM.Reflection/Reader/ModuleReader.cs
mcs/class/IKVM.Reflection/Reader/TypeDefImpl.cs
mcs/class/IKVM.Reflection/Signature.cs
mcs/class/IKVM.Reflection/Type.cs
mcs/class/IKVM.Reflection/Universe.cs
mcs/class/IKVM.Reflection/Writer/MetadataWriter.cs
mcs/mcs/ikvm.cs

index 1b3216368ae7bab80085e21b6975b396ce006300..ae495c92ce298cafddcaeca7ba27bf1fc4389884 100644 (file)
@@ -381,41 +381,9 @@ namespace IKVM.Reflection
                        return null;
                }
 
-               public bool __TryReadTypeName(out string ns, out string name)
+               [Obsolete("Use Constructor.DeclaringType instead.")]
+               internal 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)
                        {
                                ns = null;
@@ -427,6 +395,12 @@ namespace IKVM.Reflection
                        return true;
                }
 
+               // for use by mcs
+               internal byte[] __GetBlob()
+               {
+                       return ((ModuleReader)module).GetBlobCopy(module.CustomAttribute.records[index].Value);
+               }
+
                public ConstructorInfo Constructor
                {
                        get
index 9ffc91860f259b916ebe8661f06a509e6e07e42e..20881a6ef7972b76b0834caca0d14dd70ff049b8 100644 (file)
@@ -85,6 +85,11 @@ namespace IKVM.Reflection.Emit
                        return methodBuilder.GetILGenerator(streamSize);
                }
 
+               public void __ReleaseILGenerator()
+               {
+                       methodBuilder.__ReleaseILGenerator();
+               }
+
                public override CallingConventions CallingConvention
                {
                        get { return methodBuilder.CallingConvention; }
index 2efec4ea3b08aad526d1ae6958d4798f91dbba1f..b38860faf2118c1f34a47598be9ab97a1f2705cc 100644 (file)
@@ -33,6 +33,7 @@ namespace IKVM.Reflection.Emit
                private readonly FieldBuilder fieldBuilder;
 
                internal EnumBuilder(TypeBuilder typeBuilder, FieldBuilder fieldBuilder)
+                       : base(typeBuilder)
                {
                        this.typeBuilder = typeBuilder;
                        this.fieldBuilder = fieldBuilder;
@@ -58,11 +59,6 @@ namespace IKVM.Reflection.Emit
                        get { return typeBuilder.FullName; }
                }
 
-               public override Type UnderlyingSystemType
-               {
-                       get { return typeBuilder.UnderlyingSystemType; }
-               }
-
                public override Type BaseType
                {
                        get { return typeBuilder.BaseType; }
index a54e6377c9f676592a58ba265f5148853d365ade..1ebd64e132b261eda2ad35efda71e954c21fbc89 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2008-2010 Jeroen Frijters
+  Copyright (C) 2008-2011 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -37,8 +37,8 @@ namespace IKVM.Reflection.Emit
        {
                private readonly TypeBuilder typeBuilder;
                private readonly string name;
-               private readonly int nameIndex;
                private readonly int pseudoToken;
+               private int nameIndex;
                private int signature;
                private Type returnType;
                private Type[] parameterTypes;
@@ -46,7 +46,7 @@ namespace IKVM.Reflection.Emit
                private MethodAttributes attributes;
                private MethodImplAttributes implFlags;
                private ILGenerator ilgen;
-               private int rva;
+               private int rva = -1;
                private readonly CallingConventions callingConvention;
                private List<ParameterBuilder> parameters;
                private GenericTypeParameterBuilder[] gtpb;
@@ -59,9 +59,6 @@ namespace IKVM.Reflection.Emit
                        this.typeBuilder = typeBuilder;
                        this.name = name;
                        this.pseudoToken = typeBuilder.ModuleBuilder.AllocPseudoToken();
-                       // because all the MethodBuilders constitute a virtual MethodDef table, we cannot allocate the string during WriteMethodDefRecord,
-                       // since by then the metadata has already been frozen
-                       this.nameIndex = typeBuilder.ModuleBuilder.Strings.Add(name);
                        this.attributes = attributes;
                        if ((attributes & MethodAttributes.Static) == 0)
                        {
@@ -77,6 +74,10 @@ namespace IKVM.Reflection.Emit
 
                public ILGenerator GetILGenerator(int streamSize)
                {
+                       if (rva != -1)
+                       {
+                               throw new InvalidOperationException();
+                       }
                        if (ilgen == null)
                        {
                                ilgen = new ILGenerator(typeBuilder.ModuleBuilder, streamSize);
@@ -84,6 +85,23 @@ namespace IKVM.Reflection.Emit
                        return ilgen;
                }
 
+               public void __ReleaseILGenerator()
+               {
+                       if (ilgen != null)
+                       {
+                               if (this.ModuleBuilder.symbolWriter != null)
+                               {
+                                       this.ModuleBuilder.symbolWriter.OpenMethod(new SymbolToken(-pseudoToken | 0x06000000));
+                               }
+                               rva = ilgen.WriteBody(initLocals);
+                               if (this.ModuleBuilder.symbolWriter != null)
+                               {
+                                       this.ModuleBuilder.symbolWriter.CloseMethod();
+                               }
+                               ilgen = null;
+                       }
+               }
+
                public void SetCustomAttribute(ConstructorInfo con, byte[] binaryAttribute)
                {
                        SetCustomAttribute(new CustomAttributeBuilder(con, binaryAttribute));
@@ -125,7 +143,6 @@ namespace IKVM.Reflection.Emit
                        const short BestFitOff = 0x0020;
                        const short CharMapErrorOn = 0x1000;
                        const short CharMapErrorOff = 0x2000;
-                       int name = this.nameIndex;
                        short flags = CharSetNotSpec | CallConvWinapi;
                        if (bestFitMapping.HasValue)
                        {
@@ -174,10 +191,6 @@ namespace IKVM.Reflection.Emit
                                                break;
                                }
                        }
-                       if (entryName != null)
-                       {
-                               name = this.ModuleBuilder.Strings.Add(entryName);
-                       }
                        if (exactSpelling.HasValue && exactSpelling.Value)
                        {
                                flags |= NoMangle;
@@ -193,7 +206,7 @@ namespace IKVM.Reflection.Emit
                        ImplMapTable.Record rec = new ImplMapTable.Record();
                        rec.MappingFlags = flags;
                        rec.MemberForwarded = pseudoToken;
-                       rec.ImportName = name;
+                       rec.ImportName = this.ModuleBuilder.Strings.Add(entryName ?? name);
                        rec.ImportScope = this.ModuleBuilder.ModuleRef.FindOrAddRecord(dllName == null ? 0 : this.ModuleBuilder.Strings.Add(dllName));
                        this.ModuleBuilder.ImplMap.AddRecord(rec);
                }
@@ -582,25 +595,10 @@ namespace IKVM.Reflection.Emit
 
                internal void Bake()
                {
+                       this.nameIndex = this.ModuleBuilder.Strings.Add(name);
                        this.signature = this.ModuleBuilder.GetSignatureBlobIndex(this.MethodSignature);
 
-                       if (ilgen != null)
-                       {
-                               if (this.ModuleBuilder.symbolWriter != null)
-                               {
-                                       this.ModuleBuilder.symbolWriter.OpenMethod(new SymbolToken(-pseudoToken | 0x06000000));
-                               }
-                               rva = ilgen.WriteBody(initLocals);
-                               if (this.ModuleBuilder.symbolWriter != null)
-                               {
-                                       this.ModuleBuilder.symbolWriter.CloseMethod();
-                               }
-                               ilgen = null;
-                       }
-                       else
-                       {
-                               rva = -1;
-                       }
+                       __ReleaseILGenerator();
 
                        if (declarativeSecurity != null)
                        {
index 64a322bd2213c81b03d8cd53ad71aecc8cae932f..10baa17beb297749796f11533e9229b8fa363b58 100644 (file)
@@ -86,11 +86,6 @@ namespace IKVM.Reflection.Emit
                        get { return DeclaringType.Namespace; }
                }
 
-               public override Type UnderlyingSystemType
-               {
-                       get { return this; }
-               }
-
                public override string Name
                {
                        get { return name; }
@@ -1049,37 +1044,35 @@ namespace IKVM.Reflection.Emit
 
        sealed class BakedType : Type
        {
-               private readonly TypeBuilder typeBuilder;
-
                internal BakedType(TypeBuilder typeBuilder)
+                       : base(typeBuilder)
                {
-                       this.typeBuilder = typeBuilder;
                }
 
                public override string AssemblyQualifiedName
                {
-                       get { return typeBuilder.AssemblyQualifiedName; }
+                       get { return underlyingType.AssemblyQualifiedName; }
                }
 
                public override Type BaseType
                {
-                       get { return typeBuilder.BaseType; }
+                       get { return underlyingType.BaseType; }
                }
 
                public override string __Name
                {
-                       get { return typeBuilder.__Name; }
+                       get { return underlyingType.__Name; }
                }
 
                public override string __Namespace
                {
-                       get { return typeBuilder.__Namespace; }
+                       get { return underlyingType.__Namespace; }
                }
 
                public override string Name
                {
                        // we need to escape here, because TypeBuilder.Name does not escape
-                       get { return TypeNameParser.Escape(typeBuilder.__Name); }
+                       get { return TypeNameParser.Escape(underlyingType.__Name); }
                }
 
                public override string FullName
@@ -1089,108 +1082,102 @@ namespace IKVM.Reflection.Emit
 
                public override TypeAttributes Attributes
                {
-                       get { return typeBuilder.Attributes; }
+                       get { return underlyingType.Attributes; }
                }
 
                public override Type[] __GetDeclaredInterfaces()
                {
-                       return typeBuilder.__GetDeclaredInterfaces();
+                       return underlyingType.__GetDeclaredInterfaces();
                }
 
                public override MethodBase[] __GetDeclaredMethods()
                {
-                       return typeBuilder.__GetDeclaredMethods();
+                       return underlyingType.__GetDeclaredMethods();
                }
 
                public override __MethodImplMap __GetMethodImplMap()
                {
-                       return typeBuilder.__GetMethodImplMap();
+                       return underlyingType.__GetMethodImplMap();
                }
 
                public override FieldInfo[] __GetDeclaredFields()
                {
-                       return typeBuilder.__GetDeclaredFields();
+                       return underlyingType.__GetDeclaredFields();
                }
 
                public override EventInfo[] __GetDeclaredEvents()
                {
-                       return typeBuilder.__GetDeclaredEvents();
+                       return underlyingType.__GetDeclaredEvents();
                }
 
                public override PropertyInfo[] __GetDeclaredProperties()
                {
-                       return typeBuilder.__GetDeclaredProperties();
+                       return underlyingType.__GetDeclaredProperties();
                }
 
                public override Type[] __GetDeclaredTypes()
                {
-                       return typeBuilder.__GetDeclaredTypes();
+                       return underlyingType.__GetDeclaredTypes();
                }
 
                public override Type DeclaringType
                {
-                       get { return typeBuilder.DeclaringType; }
+                       get { return underlyingType.DeclaringType; }
                }
 
                public override StructLayoutAttribute StructLayoutAttribute
                {
-                       get { return typeBuilder.StructLayoutAttribute; }
-               }
-
-               public override Type UnderlyingSystemType
-               {
-                       // Type.Equals/GetHashCode relies on this
-                       get { return typeBuilder; }
+                       get { return underlyingType.StructLayoutAttribute; }
                }
 
                public override Type[] GetGenericArguments()
                {
-                       return typeBuilder.GetGenericArguments();
+                       return underlyingType.GetGenericArguments();
                }
 
                internal override Type GetGenericTypeArgument(int index)
                {
-                       return typeBuilder.GetGenericTypeArgument(index);
+                       return underlyingType.GetGenericTypeArgument(index);
                }
 
                public override Type[][] __GetGenericArgumentsOptionalCustomModifiers()
                {
-                       return typeBuilder.__GetGenericArgumentsOptionalCustomModifiers();
+                       return underlyingType.__GetGenericArgumentsOptionalCustomModifiers();
                }
 
                public override Type[][] __GetGenericArgumentsRequiredCustomModifiers()
                {
-                       return typeBuilder.__GetGenericArgumentsRequiredCustomModifiers();
+                       return underlyingType.__GetGenericArgumentsRequiredCustomModifiers();
                }
 
                public override bool IsGenericType
                {
-                       get { return typeBuilder.IsGenericType; }
+                       get { return underlyingType.IsGenericType; }
                }
 
                public override bool IsGenericTypeDefinition
                {
-                       get { return typeBuilder.IsGenericTypeDefinition; }
+                       get { return underlyingType.IsGenericTypeDefinition; }
                }
 
                public override bool ContainsGenericParameters
                {
-                       get { return typeBuilder.ContainsGenericParameters; }
+                       get { return underlyingType.ContainsGenericParameters; }
                }
 
                public override int MetadataToken
                {
-                       get { return typeBuilder.MetadataToken; }
+                       get { return underlyingType.MetadataToken; }
                }
 
                public override Module Module
                {
-                       get { return typeBuilder.Module; }
+                       get { return underlyingType.Module; }
                }
 
                internal override int GetModuleBuilderToken()
                {
-                       return typeBuilder.GetModuleBuilderToken();
+                       return underlyingType.GetModuleBuilderToken();
                }
        }
 }
index 8db04bc8e299bd2860c5790869ba3c17bcbeee93..9aa296bae89850441f9cd9ea457c47a4526957c4 100644 (file)
@@ -257,6 +257,11 @@ namespace IKVM.Reflection
                        get { return callingConvention; }
                }
 
+               internal int GenericParameterCount
+               {
+                       get { return genericParamCount; }
+               }
+
                private sealed class Binder : IGenericBinder
                {
                        private readonly Type declaringType;
index 4559447fc283ed17d3d1a5c7a9103cbf7d390e89..3fdf600ac4f09870c062b1a7bf40c96821ce71a5 100644 (file)
@@ -1,4 +1,4 @@
-/*
+/*
   Copyright (C) 2011 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
@@ -22,7 +22,6 @@
   
 */
 using System;
-using System.Text;
 using System.Collections.Generic;
 using System.Runtime.InteropServices;
 
@@ -502,6 +501,7 @@ namespace IKVM.Reflection
                private readonly Type declaringType;
                private readonly string name;
                private readonly MethodSignature signature;
+               private MethodInfo forwarder;
 
                internal MissingMethod(Type declaringType, string name, MethodSignature signature)
                {
@@ -510,9 +510,40 @@ namespace IKVM.Reflection
                        this.signature = signature;
                }
 
+               private MethodInfo Forwarder
+               {
+                       get
+                       {
+                               MethodInfo method = TryGetForwarder();
+                               if (method == null)
+                               {
+                                       throw new MissingMemberException(this);
+                               }
+                               return method;
+                       }
+               }
+
+               private MethodInfo TryGetForwarder()
+               {
+                       if (forwarder == null && !declaringType.__IsMissing)
+                       {
+                               MethodBase mb = declaringType.FindMethod(name, signature);
+                               ConstructorInfo ci = mb as ConstructorInfo;
+                               if (ci != null)
+                               {
+                                       forwarder = ci.GetMethodInfo();
+                               }
+                               else
+                               {
+                                       forwarder = (MethodInfo)mb;
+                               }
+                       }
+                       return forwarder;
+               }
+
                public override bool __IsMissing
                {
-                       get { return true; }
+                       get { return TryGetForwarder() == null; }
                }
 
                public override Type ReturnType
@@ -532,7 +563,7 @@ namespace IKVM.Reflection
 
                internal override int ParameterCount
                {
-                       get { throw new MissingMemberException(this); }
+                       get { return signature.GetParameterCount(); }
                }
 
                private sealed class ParameterInfoImpl : ParameterInfo
@@ -546,9 +577,14 @@ namespace IKVM.Reflection
                                this.index = index;
                        }
 
+                       private ParameterInfo Forwarder
+                       {
+                               get { return index == -1 ? method.Forwarder.ReturnParameter : method.Forwarder.GetParameters()[index]; }
+                       }
+
                        public override string Name
                        {
-                               get { throw new MissingMemberException(method); }
+                               get { return Forwarder.Name; }
                        }
 
                        public override Type ParameterType
@@ -558,7 +594,7 @@ namespace IKVM.Reflection
 
                        public override ParameterAttributes Attributes
                        {
-                               get { throw new MissingMemberException(method); }
+                               get { return Forwarder.Attributes; }
                        }
 
                        public override int Position
@@ -568,7 +604,7 @@ namespace IKVM.Reflection
 
                        public override object RawDefaultValue
                        {
-                               get { throw new MissingMemberException(method); }
+                               get { return Forwarder.RawDefaultValue; }
                        }
 
                        public override Type[] GetOptionalCustomModifiers()
@@ -596,18 +632,28 @@ namespace IKVM.Reflection
 
                        public override int MetadataToken
                        {
-                               get { throw new MissingMemberException(method); }
+                               get { return Forwarder.MetadataToken; }
                        }
 
                        internal override Module Module
                        {
                                get { return method.Module; }
                        }
+
+                       internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
+                       {
+                               return Forwarder.GetCustomAttributesData(attributeType);
+                       }
+
+                       public override string ToString()
+                       {
+                               return Forwarder.ToString();
+                       }
                }
 
                public override ParameterInfo[] GetParameters()
                {
-                       ParameterInfoImpl[] parameters = new ParameterInfoImpl[signature.GetParameterCount()];
+                       ParameterInfo[] parameters = new ParameterInfo[signature.GetParameterCount()];
                        for (int i = 0; i < parameters.Length; i++)
                        {
                                parameters[i] = new ParameterInfoImpl(this, i);
@@ -617,17 +663,17 @@ namespace IKVM.Reflection
 
                public override MethodAttributes Attributes
                {
-                       get { throw new MissingMemberException(this); }
+                       get { return Forwarder.Attributes; }
                }
 
                public override MethodImplAttributes GetMethodImplementationFlags()
                {
-                       throw new MissingMemberException(this);
+                       return Forwarder.GetMethodImplementationFlags();
                }
 
                public override MethodBody GetMethodBody()
                {
-                       throw new MissingMemberException(this);
+                       return Forwarder.GetMethodBody();
                }
 
                public override CallingConventions CallingConvention
@@ -637,7 +683,7 @@ namespace IKVM.Reflection
 
                internal override int ImportTo(IKVM.Reflection.Emit.ModuleBuilder module)
                {
-                       throw new MissingMemberException(this);
+                       return Forwarder.ImportTo(module);
                }
 
                public override string Name
@@ -668,5 +714,70 @@ namespace IKVM.Reflection
                {
                        return declaringType.GetHashCode() ^ name.GetHashCode() ^ signature.GetHashCode();
                }
+
+               internal override MethodBase BindTypeParameters(Type type)
+               {
+                       return Forwarder.BindTypeParameters(type);
+               }
+
+               public override bool ContainsGenericParameters
+               {
+                       get { return Forwarder.ContainsGenericParameters; }
+               }
+
+               internal override IList<CustomAttributeData> GetCustomAttributesData(Type attributeType)
+               {
+                       return Forwarder.GetCustomAttributesData(attributeType);
+               }
+
+               public override Type[] GetGenericArguments()
+               {
+                       return Forwarder.GetGenericArguments();
+               }
+
+               internal override Type GetGenericMethodArgument(int index)
+               {
+                       return Forwarder.GetGenericMethodArgument(index);
+               }
+
+               internal override int GetGenericMethodArgumentCount()
+               {
+                       return Forwarder.GetGenericMethodArgumentCount();
+               }
+
+               public override MethodInfo GetGenericMethodDefinition()
+               {
+                       return Forwarder.GetGenericMethodDefinition();
+               }
+
+               internal override MethodInfo GetMethodOnTypeDefinition()
+               {
+                       return Forwarder.GetMethodOnTypeDefinition();
+               }
+
+               internal override bool HasThis
+               {
+                       get { return Forwarder.HasThis; }
+               }
+
+               public override bool IsGenericMethod
+               {
+                       get { return IsGenericMethodDefinition; }
+               }
+
+               public override bool IsGenericMethodDefinition
+               {
+                       get { return signature.GenericParameterCount != 0; }
+               }
+
+               public override MethodInfo MakeGenericMethod(params Type[] typeArguments)
+               {
+                       return Forwarder.MakeGenericMethod(typeArguments);
+               }
+
+               public override int MetadataToken
+               {
+                       get { return Forwarder.MetadataToken; }
+               }
        }
 }
index cbed322a3596340f060f1dc185e2c0ff2be39111..2895457d47065bb377386088030f849d6a2b3eaf 100644 (file)
@@ -73,11 +73,6 @@ namespace IKVM.Reflection.Reader
                        get { return TypeAttributes.Public; }
                }
 
-               public sealed override Type UnderlyingSystemType
-               {
-                       get { return this; }
-               }
-
                public sealed override string FullName
                {
                        get { return null; }
index 0bbe475a61de0a964facf386cfe841094af454f3..28a4720d9bd29a0f7fa092d99069f37ae1be1912 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2009 Jeroen Frijters
+  Copyright (C) 2009-2011 Jeroen Frijters
 
   This software is provided 'as-is', without any express or implied
   warranty.  In no event will the authors be held liable for any damages
@@ -31,76 +31,105 @@ namespace IKVM.Reflection.Reader
 {
        sealed class MetadataReader : MetadataRW
        {
-               private readonly BinaryReader br;
+               private readonly Stream stream;
+               private const int bufferLength = 2048;
+               private readonly byte[] buffer = new byte[bufferLength];
+               private int pos = bufferLength;
 
-               internal MetadataReader(ModuleReader module, BinaryReader br, byte heapSizes)
+               internal MetadataReader(ModuleReader module, Stream stream, byte heapSizes)
                        : base(module, (heapSizes & 0x01) != 0, (heapSizes & 0x02) != 0, (heapSizes & 0x04) != 0)
                {
-                       this.br = br;
+                       this.stream = stream;
                }
 
-               internal short ReadInt16()
+               private void FillBuffer(int needed)
                {
-                       return br.ReadInt16();
+                       int count = bufferLength - pos;
+                       if (count != 0)
+                       {
+                               // move remaining bytes to the front of the buffer
+                               Buffer.BlockCopy(buffer, pos, buffer, 0, count);
+                       }
+                       pos = 0;
+
+                       while (count < needed)
+                       {
+                               int len = stream.Read(buffer, count, bufferLength - count);
+                               if (len == 0)
+                               {
+                                       throw new BadImageFormatException();
+                               }
+                               count += len;
+                       }
+
+                       if (count != bufferLength)
+                       {
+                               // we didn't fill the buffer completely, so have to restore the invariant
+                               // that all data from pos up until the end of the buffer is valid
+                               Buffer.BlockCopy(buffer, 0, buffer, bufferLength - count, count);
+                               pos = bufferLength - count;
+                       }
                }
 
                internal ushort ReadUInt16()
                {
-                       return br.ReadUInt16();
+                       return (ushort)ReadInt16();
                }
 
-               internal int ReadInt32()
+               internal short ReadInt16()
                {
-                       return br.ReadInt32();
+                       if (pos > bufferLength - 2)
+                       {
+                               FillBuffer(2);
+                       }
+                       byte b1 = buffer[pos++];
+                       byte b2 = buffer[pos++];
+                       return (short)(b1 | (b2 << 8));
                }
 
-               internal int ReadStringIndex()
+               internal int ReadInt32()
                {
-                       if (bigStrings)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
+                       if (pos > bufferLength - 4)
                        {
-                               return br.ReadUInt16();
+                               FillBuffer(4);
                        }
+                       byte b1 = buffer[pos++];
+                       byte b2 = buffer[pos++];
+                       byte b3 = buffer[pos++];
+                       byte b4 = buffer[pos++];
+                       return b1 | (b2 << 8) | (b3 << 16) | (b4 << 24);
                }
 
-               internal int ReadGuidIndex()
+               private int ReadIndex(bool big)
                {
-                       if (bigGuids)
+                       if (big)
                        {
-                               return br.ReadInt32();
+                               return ReadInt32();
                        }
                        else
                        {
-                               return br.ReadUInt16();
+                               return ReadUInt16();
                        }
                }
 
+               internal int ReadStringIndex()
+               {
+                       return ReadIndex(bigStrings);
+               }
+
+               internal int ReadGuidIndex()
+               {
+                       return ReadIndex(bigGuids);
+               }
+
                internal int ReadBlobIndex()
                {
-                       if (bigBlobs)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
-                       {
-                               return br.ReadUInt16();
-                       }
+                       return ReadIndex(bigBlobs);
                }
 
                internal int ReadResolutionScope()
                {
-                       int codedIndex;
-                       if (bigResolutionScope)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigResolutionScope);
                        switch (codedIndex & 3)
                        {
                                case 0:
@@ -118,15 +147,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadTypeDefOrRef()
                {
-                       int codedIndex;
-                       if (bigTypeDefOrRef)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigTypeDefOrRef);
                        switch (codedIndex & 3)
                        {
                                case 0:
@@ -142,15 +163,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadMemberRefParent()
                {
-                       int codedIndex;
-                       if (bigMemberRefParent)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigMemberRefParent);
                        switch (codedIndex & 7)
                        {
                                case 0:
@@ -170,15 +183,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadHasCustomAttribute()
                {
-                       int codedIndex;
-                       if (bigHasCustomAttribute)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigHasCustomAttribute);
                        switch (codedIndex & 31)
                        {
                                case 0:
@@ -228,15 +233,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadCustomAttributeType()
                {
-                       int codedIndex;
-                       if (bigCustomAttributeType)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigCustomAttributeType);
                        switch (codedIndex & 7)
                        {
                                case 2:
@@ -250,15 +247,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadMethodDefOrRef()
                {
-                       int codedIndex;
-                       if (bigMethodDefOrRef)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigMethodDefOrRef);
                        switch (codedIndex & 1)
                        {
                                case 0:
@@ -272,15 +261,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadHasConstant()
                {
-                       int codedIndex;
-                       if (bigHasConstant)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigHasConstant);
                        switch (codedIndex & 3)
                        {
                                case 0:
@@ -296,15 +277,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadHasSemantics()
                {
-                       int codedIndex;
-                       if (bigHasSemantics)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigHasSemantics);
                        switch (codedIndex & 1)
                        {
                                case 0:
@@ -318,15 +291,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadHasFieldMarshal()
                {
-                       int codedIndex;
-                       if (bigHasFieldMarshal)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigHasFieldMarshal);
                        switch (codedIndex & 1)
                        {
                                case 0:
@@ -340,15 +305,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadHasDeclSecurity()
                {
-                       int codedIndex;
-                       if (bigHasDeclSecurity)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigHasDeclSecurity);
                        switch (codedIndex & 3)
                        {
                                case 0:
@@ -364,15 +321,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadTypeOrMethodDef()
                {
-                       int codedIndex;
-                       if (bigTypeOrMethodDef)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigTypeOrMethodDef);
                        switch (codedIndex & 1)
                        {
                                case 0:
@@ -386,15 +335,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadMemberForwarded()
                {
-                       int codedIndex;
-                       if (bigMemberForwarded)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigMemberForwarded);
                        switch (codedIndex & 1)
                        {
                                case 0:
@@ -408,15 +349,7 @@ namespace IKVM.Reflection.Reader
 
                internal int ReadImplementation()
                {
-                       int codedIndex;
-                       if (bigImplementation)
-                       {
-                               codedIndex = br.ReadInt32();
-                       }
-                       else
-                       {
-                               codedIndex = br.ReadUInt16();
-                       }
+                       int codedIndex = ReadIndex(bigImplementation);
                        switch (codedIndex & 3)
                        {
                                case 0:
@@ -430,93 +363,44 @@ namespace IKVM.Reflection.Reader
                        }
                }
 
-               private int ReadToken(int table, bool big)
-               {
-                       int rid;
-                       if (big)
-                       {
-                               rid = br.ReadInt32();
-                       }
-                       else
-                       {
-                               rid = br.ReadUInt16();
-                       }
-                       return rid | (table << 24);
-               }
-
                internal int ReadField()
                {
-                       if (bigField)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
-                       {
-                               return br.ReadUInt16();
-                       }
+                       return ReadIndex(bigField);
                }
 
                internal int ReadMethodDef()
                {
-                       if (bigMethodDef)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
-                       {
-                               return br.ReadUInt16();
-                       }
+                       return ReadIndex(bigMethodDef);
                }
 
                internal int ReadParam()
                {
-                       if (bigParam)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
-                       {
-                               return br.ReadUInt16();
-                       }
+                       return ReadIndex(bigParam);
                }
 
                internal int ReadProperty()
                {
-                       if (bigProperty)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
-                       {
-                               return br.ReadUInt16();
-                       }
+                       return ReadIndex(bigProperty);
                }
 
                internal int ReadEvent()
                {
-                       if (bigEvent)
-                       {
-                               return br.ReadInt32();
-                       }
-                       else
-                       {
-                               return br.ReadUInt16();
-                       }
+                       return ReadIndex(bigEvent);
                }
 
                internal int ReadTypeDef()
                {
-                       return ReadToken(TypeDefTable.Index, bigTypeDef);
+                       return ReadIndex(bigTypeDef) | (TypeDefTable.Index << 24);
                }
 
                internal int ReadGenericParam()
                {
-                       return ReadToken(GenericParamTable.Index, bigGenericParam);
+                       return ReadIndex(bigGenericParam) | (GenericParamTable.Index << 24);
                }
 
                internal int ReadModuleRef()
                {
-                       return ReadToken(ModuleRefTable.Index, bigModuleRef);
+                       return ReadIndex(bigModuleRef) | (ModuleRefTable.Index << 24);
                }
        }
 }
index 8f83ad092449682d799995ca2be7bf578a2401ef..d0db64cd2f2b94a6ac5630233c866ff3303768bb 100644 (file)
@@ -199,7 +199,7 @@ namespace IKVM.Reflection.Reader
                                        tables[i].RowCount = 0;
                                }
                        }
-                       MetadataReader mr = new MetadataReader(this, br, HeapSizes);
+                       MetadataReader mr = new MetadataReader(this, br.BaseStream, HeapSizes);
                        for (int i = 0; i < 64; i++)
                        {
                                if ((Valid & (1UL << i)) != 0)
@@ -814,7 +814,7 @@ namespace IKVM.Reflection.Reader
                                        }
                                        type = type.BaseType;
                                } while (type != null);
-                               throw new MissingMethodException(org.ToString(), name);
+                               return universe.GetMissingMethodOrThrow(org, name, methodSig);
                        }
                }
 
index 4be7dcc9ac53a95f6d6ad898ace292189cbce2db..707d803b9cd1f811b390edc2f916d6b60bf80c40 100644 (file)
@@ -216,11 +216,6 @@ namespace IKVM.Reflection.Reader
                        get { return GetFullName(); }
                }
 
-               public override Type UnderlyingSystemType
-               {
-                       get { return this; }
-               }
-
                public override int MetadataToken
                {
                        get { return (TypeDefTable.Index << 24) + index + 1; }
index 356eb54ddcd3da746215d445b9888087785446e6..cf808cacf48fdbb915bb5e5bca7edbc58ef4b03e 100644 (file)
@@ -360,10 +360,18 @@ namespace IKVM.Reflection
                        {
                                bb.Write(ELEMENT_TYPE_VOID);
                        }
+                       else if (type == u.System_Int32)
+                       {
+                               bb.Write(ELEMENT_TYPE_I4);
+                       }
                        else if (type == u.System_Boolean)
                        {
                                bb.Write(ELEMENT_TYPE_BOOLEAN);
                        }
+                       else if (type == u.System_String)
+                       {
+                               bb.Write(ELEMENT_TYPE_STRING);
+                       }
                        else if (type == u.System_Char)
                        {
                                bb.Write(ELEMENT_TYPE_CHAR);
@@ -384,10 +392,6 @@ namespace IKVM.Reflection
                        {
                                bb.Write(ELEMENT_TYPE_U2);
                        }
-                       else if (type == u.System_Int32)
-                       {
-                               bb.Write(ELEMENT_TYPE_I4);
-                       }
                        else if (type == u.System_UInt32)
                        {
                                bb.Write(ELEMENT_TYPE_U4);
@@ -408,10 +412,6 @@ namespace IKVM.Reflection
                        {
                                bb.Write(ELEMENT_TYPE_R8);
                        }
-                       else if (type == u.System_String)
-                       {
-                               bb.Write(ELEMENT_TYPE_STRING);
-                       }
                        else if (type == u.System_IntPtr)
                        {
                                bb.Write(ELEMENT_TYPE_I);
index e39a244acec6a14fad7d95ba536e7a8a299519e8..22cb532856e1b26a6a799cf0ca9404dd3ed2219d 100644 (file)
@@ -44,10 +44,17 @@ namespace IKVM.Reflection
        public abstract class Type : MemberInfo, IGenericContext, IGenericBinder
        {
                public static readonly Type[] EmptyTypes = Empty<Type>.Array;
+               protected readonly Type underlyingType;
 
                // prevent subclassing by outsiders
                internal Type()
                {
+                       this.underlyingType = this;
+               }
+
+               internal Type(Type underlyingType)
+               {
+                       this.underlyingType = underlyingType;
                }
 
                public static Binder DefaultBinder
@@ -180,9 +187,9 @@ namespace IKVM.Reflection
                        get { return null; }
                }
 
-               public virtual Type UnderlyingSystemType
+               public Type UnderlyingSystemType
                {
-                       get { return this; }
+                       get { return underlyingType; }
                }
 
                public override Type DeclaringType
@@ -222,9 +229,23 @@ namespace IKVM.Reflection
                        throw new InvalidOperationException();
                }
 
+               public static bool operator ==(Type t1, Type t2)
+               {
+                       // Casting to object results in smaller code than calling ReferenceEquals and makes
+                       // this method more likely to be inlined.
+                       // On CLR v2 x86, microbenchmarks show this to be faster than calling ReferenceEquals.
+                       return (object)t1 == (object)t2
+                               || ((object)t1 != null && (object)t2 != null && (object)t1.underlyingType == (object)t2.underlyingType);
+               }
+
+               public static bool operator !=(Type t1, Type t2)
+               {
+                       return !(t1 == t2);
+               }
+
                public bool Equals(Type type)
                {
-                       return !ReferenceEquals(type, null) && ReferenceEquals(type.UnderlyingSystemType, this.UnderlyingSystemType);
+                       return this == type;
                }
 
                public override bool Equals(object obj)
@@ -2329,11 +2350,6 @@ namespace IKVM.Reflection
                        get { return type.Namespace; }
                }
 
-               public override Type UnderlyingSystemType
-               {
-                       get { return this; }
-               }
-
                public override string Name
                {
                        get { return type.Name; }
index 9d78c2442d97b3a0571e40b9497c12c3277bf88b..b7068323df29435f92094766a21c9634f99e63fd 100644 (file)
@@ -85,7 +85,7 @@ namespace IKVM.Reflection
                private readonly Dictionary<string, Assembly> assembliesByName = new Dictionary<string, Assembly>();
                private readonly Dictionary<System.Type, Type> importedTypes = new Dictionary<System.Type, Type>();
                private Dictionary<ScopedTypeName, Type> missingTypes;
-               private bool resolveMissingTypes;
+               private bool resolveMissingMembers;
                private Type typeof_System_Object;
                private Type typeof_System_ValueType;
                private Type typeof_System_Enum;
@@ -815,9 +815,9 @@ namespace IKVM.Reflection
                        return asm;
                }
 
-               public void EnableMissingTypeResolution()
+               public void EnableMissingMemberResolution()
                {
-                       resolveMissingTypes = true;
+                       resolveMissingMembers = true;
                }
 
                private struct ScopedTypeName : IEquatable<ScopedTypeName>
@@ -850,7 +850,7 @@ namespace IKVM.Reflection
 
                internal Type GetMissingTypeOrThrow(Module module, Type declaringType, TypeName typeName)
                {
-                       if (resolveMissingTypes || module.Assembly.__IsMissing)
+                       if (resolveMissingMembers || module.Assembly.__IsMissing)
                        {
                                if (missingTypes == null)
                                {
@@ -872,5 +872,19 @@ namespace IKVM.Reflection
                        }
                        throw new TypeLoadException(String.Format("Type '{0}' not found in assembly '{1}'", fullName, module.Assembly.FullName));
                }
+
+               internal MethodBase GetMissingMethodOrThrow(Type declaringType, string name, MethodSignature signature)
+               {
+                       if (resolveMissingMembers)
+                       {
+                               MethodInfo method = new MissingMethod(declaringType, name, signature);
+                               if (name == ".ctor")
+                               {
+                                       return new ConstructorInfoImpl(method);
+                               }
+                               return method;
+                       }
+                       throw new MissingMethodException(declaringType.ToString(), name);
+               }
        }
 }
index 1f17b3815ec2fce645e3615b5cad0a630ed7ccc4..edb0ddac638e35078cfc043becd16e5b43028b77 100644 (file)
@@ -75,9 +75,8 @@ namespace IKVM.Reflection.Writer
 
                internal void Write(short value)
                {
-                       buffer[0] = (byte)value;
-                       buffer[1] = (byte)(value >> 8);
-                       stream.Write(buffer, 0, 2);
+                       stream.WriteByte((byte)value);
+                       stream.WriteByte((byte)(value >> 8));
                }
 
                internal void Write(uint value)
index 9c575dfa711a5007347abcb31d876e0cba9e8f26..738345523fe03ae12ad87b1bf258bec92f3fe28d 100644 (file)
@@ -210,7 +210,7 @@ namespace Mono.CSharp
                {
                        this.importer = importer;
                        domain = new Universe ();
-                       domain.EnableMissingTypeResolution ();
+                       domain.EnableMissingMemberResolution ();
                        domain.AssemblyResolve += AssemblyReferenceResolver;
                        loaded_names = new List<Tuple<AssemblyName, string, Assembly>> ();