Beispiel #1
0
        MethodSpecification ImportMethodSpecification(MethodReference method, ImportGenericContext context)
        {
            if (!method.IsGenericInstance)
                throw new NotSupportedException();

            var instance = (GenericInstanceMethod)method;
            var element_method = ImportMethod(instance.ElementMethod, context);
            var imported_instance = new GenericInstanceMethod(element_method);

            var arguments = instance.GenericArguments;
            var imported_arguments = imported_instance.GenericArguments;

            for (int i = 0; i < arguments.Count; i++)
                imported_arguments.Add(ImportType(arguments[i], context));

            return imported_instance;
        }
Beispiel #2
0
        TypeReference ImportTypeSpecification(TypeReference type, ImportGenericContext context)
        {
            switch (type.etype)
            {
                case ElementType.SzArray:
                    var vector = (ArrayType)type;
                    return new ArrayType(ImportType(vector.ElementType, context));
                case ElementType.Ptr:
                    var pointer = (PointerType)type;
                    return new PointerType(ImportType(pointer.ElementType, context));
                case ElementType.ByRef:
                    var byref = (ByReferenceType)type;
                    return new ByReferenceType(ImportType(byref.ElementType, context));
                case ElementType.Pinned:
                    var pinned = (PinnedType)type;
                    return new PinnedType(ImportType(pinned.ElementType, context));
                case ElementType.Sentinel:
                    var sentinel = (SentinelType)type;
                    return new SentinelType(ImportType(sentinel.ElementType, context));
                case ElementType.CModOpt:
                    var modopt = (OptionalModifierType)type;
                    return new OptionalModifierType(
                        ImportType(modopt.ModifierType, context),
                        ImportType(modopt.ElementType, context));
                case ElementType.CModReqD:
                    var modreq = (RequiredModifierType)type;
                    return new RequiredModifierType(
                        ImportType(modreq.ModifierType, context),
                        ImportType(modreq.ElementType, context));
                case ElementType.Array:
                    var array = (ArrayType)type;
                    var imported_array = new ArrayType(ImportType(array.ElementType, context));
                    if (array.IsVector)
                        return imported_array;

                    var dimensions = array.Dimensions;
                    var imported_dimensions = imported_array.Dimensions;

                    imported_dimensions.Clear();

                    for (int i = 0; i < dimensions.Count; i++)
                    {
                        var dimension = dimensions[i];

                        imported_dimensions.Add(new ArrayDimension(dimension.LowerBound, dimension.UpperBound));
                    }

                    return imported_array;
                case ElementType.GenericInst:
                    var instance = (GenericInstanceType)type;
                    var element_type = ImportType(instance.ElementType, context);
                    var imported_instance = new GenericInstanceType(element_type);

                    var arguments = instance.GenericArguments;
                    var imported_arguments = imported_instance.GenericArguments;

                    for (int i = 0; i < arguments.Count; i++)
                        imported_arguments.Add(ImportType(arguments[i], context));

                    return imported_instance;
                case ElementType.Var:
                    var var_parameter = (GenericParameter)type;
                    return context.TypeParameter(type.DeclaringType.FullName, var_parameter.Position);
                case ElementType.MVar:
                    var mvar_parameter = (GenericParameter)type;
                    return context.MethodParameter(mvar_parameter.DeclaringMethod.Name, mvar_parameter.Position);
            }

            throw new NotSupportedException(type.etype.ToString());
        }
Beispiel #3
0
        public MethodReference ImportMethod(MethodReference method, ImportGenericContext context)
        {
            if (method.IsGenericInstance)
                return ImportMethodSpecification(method, context);

            var declaring_type = ImportType(method.DeclaringType, context);

            var reference = new MethodReference
            {
                Name = method.Name,
                HasThis = method.HasThis,
                ExplicitThis = method.ExplicitThis,
                DeclaringType = declaring_type,
                CallingConvention = method.CallingConvention,
            };

            if (method.HasGenericParameters)
                ImportGenericParameters(reference, method);

            context.Push(reference);
            try
            {
                reference.ReturnType = ImportType(method.ReturnType, context);

                if (!method.HasParameters)
                    return reference;

                var reference_parameters = reference.Parameters;

                var parameters = method.Parameters;
                for (int i = 0; i < parameters.Count; i++)
                    reference_parameters.Add(
                        new ParameterDefinition(ImportType(parameters[i].ParameterType, context)));

                return reference;
            }
            finally
            {
                context.Pop();
            }
        }
Beispiel #4
0
        public TypeReference ImportType(TypeReference type, ImportGenericContext context)
        {
            if (type.IsTypeSpecification())
                return ImportTypeSpecification(type, context);

            var reference = new TypeReference(
                type.Namespace,
                type.Name,
                module,
                ImportScope(type.Scope),
                type.IsValueType);

            MetadataSystem.TryProcessPrimitiveTypeReference(reference);

            if (type.IsNested)
                reference.DeclaringType = ImportType(type.DeclaringType, context);

            if (type.HasGenericParameters)
                ImportGenericParameters(reference, type);

            return reference;
        }
Beispiel #5
0
        TypeReference ImportTypeSpecification(Type type, ImportGenericContext context)
        {
            if (type.IsByRef)
                return new ByReferenceType(ImportType(type.GetElementType(), context));

            if (type.IsPointer)
                return new PointerType(ImportType(type.GetElementType(), context));

            if (type.IsArray)
                return new ArrayType(ImportType(type.GetElementType(), context), type.GetArrayRank());

            if (type.IsGenericType)
                return ImportGenericInstance(type, context);

            if (type.IsGenericParameter)
                return ImportGenericParameter(type, context);

            throw new NotSupportedException(type.FullName);
        }
Beispiel #6
0
        public FieldReference ImportField(FieldReference field, ImportGenericContext context)
        {
            var declaring_type = ImportType(field.DeclaringType, context);

            context.Push(declaring_type);
            try
            {
                return new FieldReference
                {
                    Name = field.Name,
                    DeclaringType = declaring_type,
                    FieldType = ImportType(field.FieldType, context),
                };
            }
            finally
            {
                context.Pop();
            }
        }
Beispiel #7
0
 public TypeReference ImportType(Type type, ImportGenericContext context)
 {
     return ImportType(type, context, ImportGenericKind.Open);
 }
Beispiel #8
0
        public TypeReference ImportType(Type type, ImportGenericContext context, ImportGenericKind import_kind)
        {
            if (IsTypeSpecification(type) || ImportOpenGenericType(type, import_kind))
                return ImportTypeSpecification(type, context);

            var reference = new TypeReference(
                string.Empty,
                type.Name,
                module,
                ImportScope(type.Assembly),
                type.IsValueType);

            reference.etype = ImportElementType(type);

            if (IsNestedType(type))
                reference.DeclaringType = ImportType(type.DeclaringType, context, import_kind);
            else
                reference.Namespace = type.Namespace ?? string.Empty;

            if (type.IsGenericType)
                ImportGenericParameters(reference, type.GetGenericArguments());

            return reference;
        }
Beispiel #9
0
        MethodReference ImportMethodSpecification(SR.MethodBase method, ImportGenericContext context)
        {
            var method_info = method as SR.MethodInfo;
            if (method_info == null)
                throw new InvalidOperationException();

            var element_method = ImportMethod(method_info.GetGenericMethodDefinition(), context, ImportGenericKind.Definition);
            var instance = new GenericInstanceMethod(element_method);
            var arguments = method.GetGenericArguments();
            var instance_arguments = instance.GenericArguments;

            context.Push(element_method);
            try
            {
                for (int i = 0; i < arguments.Length; i++)
                    instance_arguments.Add(ImportType(arguments[i], context));

                return instance;
            }
            finally
            {
                context.Pop();
            }
        }
Beispiel #10
0
        public MethodReference ImportMethod(SR.MethodBase method, ImportGenericContext context, ImportGenericKind import_kind)
        {
            if (IsMethodSpecification(method) || ImportOpenGenericMethod(method, import_kind))
                return ImportMethodSpecification(method, context);

            var declaring_type = ImportType(method.DeclaringType, context);

            if (IsGenericInstance(method.DeclaringType))
                method = method.Module.ResolveMethod(method.MetadataToken);

            var reference = new MethodReference
            {
                Name = method.Name,
                HasThis = HasCallingConvention(method, SR.CallingConventions.HasThis),
                ExplicitThis = HasCallingConvention(method, SR.CallingConventions.ExplicitThis),
                DeclaringType = ImportType(method.DeclaringType, context, ImportGenericKind.Definition),
            };

            if (HasCallingConvention(method, SR.CallingConventions.VarArgs))
                reference.CallingConvention &= MethodCallingConvention.VarArg;

            if (method.IsGenericMethod)
                ImportGenericParameters(reference, method.GetGenericArguments());

            context.Push(reference);
            try
            {
                var method_info = method as SR.MethodInfo;
                reference.ReturnType = method_info != null
                    ? ImportType(method_info.ReturnType, context)
                    : ImportType(typeof(void), default(ImportGenericContext));

                var parameters = method.GetParameters();
                var reference_parameters = reference.Parameters;

                for (int i = 0; i < parameters.Length; i++)
                    reference_parameters.Add(
                        new ParameterDefinition(ImportType(parameters[i].ParameterType, context)));

                reference.DeclaringType = declaring_type;

                return reference;
            }
            finally
            {
                context.Pop();
            }
        }
Beispiel #11
0
        static TypeReference ImportGenericParameter(Type type, ImportGenericContext context)
        {
            if (context.IsEmpty)
                throw new InvalidOperationException();

            if (type.DeclaringMethod != null)
                return context.MethodParameter(type.DeclaringMethod.Name, type.GenericParameterPosition);

            if (type.DeclaringType != null)
                return context.TypeParameter(NormalizedFullName(type.DeclaringType), type.GenericParameterPosition);

            throw new InvalidOperationException();
        }
Beispiel #12
0
        TypeReference ImportGenericInstance(Type type, ImportGenericContext context)
        {
            var element_type = ImportType(type.GetGenericTypeDefinition(), context, ImportGenericKind.Definition);
            var instance = new GenericInstanceType(element_type);
            var arguments = type.GetGenericArguments();
            var instance_arguments = instance.GenericArguments;

            context.Push(element_type);
            try
            {
                for (int i = 0; i < arguments.Length; i++)
                    instance_arguments.Add(ImportType(arguments[i], context));

                return instance;
            }
            finally
            {
                context.Pop();
            }
        }
Beispiel #13
0
        public FieldReference ImportField(SR.FieldInfo field, ImportGenericContext context)
        {
            var declaring_type = ImportType(field.DeclaringType, context);

            if (IsGenericInstance(field.DeclaringType))
                field = ResolveFieldDefinition(field);

            context.Push(declaring_type);
            try
            {
                return new FieldReference
                {
                    Name = field.Name,
                    DeclaringType = declaring_type,
                    FieldType = ImportType(field.FieldType, context),
                };
            }
            finally
            {
                context.Pop();
            }
        }