Beispiel #1
0
		static bool IsSystemVoid(TypeSig type) {
			return type.RemovePinnedAndModifiers().GetElementType() == ElementType.Void;
		}
Beispiel #2
0
 public static bool HasModifierOrPinned(this TypeSig signature)
 {
     return(signature is ModifierSig || signature is PinnedSig);
 }
Beispiel #3
0
        (string methodName, DkmClrCompilationResultFlags flags) AddMethod(TypeSig type, int index, bool isLocal)
        {
            var methodName = methodNamePrefix + methodNameIndex++.ToString();

            var callConv = CallingConvention.Default;

            if (sourceMethod.MethodSig.Generic)
            {
                callConv |= CallingConvention.Generic;
            }
            var methodSig = new MethodSig(callConv, sourceMethod.MethodSig.GenParamCount);

            methodSig.RetType = generatedModule.Import(type.RemovePinnedAndModifiers());
            if (methodSig.RetType.IsByRef)
            {
                methodSig.RetType = methodSig.RetType.Next.RemovePinnedAndModifiers();
            }

            if (lastMethodSig != null)
            {
                foreach (var p in lastMethodSig.Params)
                {
                    methodSig.Params.Add(p);
                }
            }
            else
            {
                if (sourceMethod.MethodSig.HasThis)
                {
                    methodSig.Params.Add(generatedModule.Import(sourceMethod.DeclaringType).ToTypeSig());
                }
                foreach (var p in sourceMethod.MethodSig.Params)
                {
                    methodSig.Params.Add(generatedModule.Import(p));
                }
            }

            const MethodImplAttributes methodImplFlags = MethodImplAttributes.IL | MethodImplAttributes.Managed;
            const MethodAttributes     methodFlags     = MethodAttributes.Assembly | MethodAttributes.Static | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.ReuseSlot;
            var method = new MethodDefUser(methodName, methodSig, methodImplFlags, methodFlags);

            getLocalsType.Methods.Add(method);

            foreach (var gp in sourceMethod.GenericParameters)
            {
                method.GenericParameters.Add(Clone(gp));
            }

            var body = new CilBody();

            method.Body     = body;
            body.InitLocals = true;
            if (sourceMethod.Body != null)
            {
                foreach (var l in sourceMethod.Body.Variables)
                {
                    body.Variables.Add(new Local(generatedModule.Import(l.Type), l.Name));
                }
            }
            body.Instructions.Add(CreateLoadVariable(method, body.Variables, index, isLocal));
            if (type.RemovePinnedAndModifiers().GetElementType() == ElementType.ByRef)
            {
                body.Instructions.Add(LoadIndirect(type.RemovePinnedAndModifiers().Next.RemovePinnedAndModifiers()));
            }
            body.Instructions.Add(Instruction.Create(OpCodes.Ret));

            lastMethodSig = methodSig;
            var flags = DkmClrCompilationResultFlags.None;

            if (methodSig.RetType.RemovePinnedAndModifiers().GetElementType() == ElementType.Boolean)
            {
                flags |= DkmClrCompilationResultFlags.BoolResult;
            }
            return(methodName, flags);
        }
		void WriteValue(TypeSig argType, CAArgument value) {
			if (argType == null || value.Type == null) {
				helper.Error("Argument type is null");
				return;
			}
			if (!recursionCounter.Increment()) {
				helper.Error("Infinite recursion");
				return;
			}

			var arrayType = argType as SZArraySig;
			if (arrayType != null) {
				var argsArray = value.Value as IList<CAArgument>;
				if (argsArray == null && value.Value != null)
					helper.Error("Value is not null or an array");
				WriteArrayValue(arrayType, argsArray);
			}
			else
				WriteElem(argType, value);

			recursionCounter.Decrement();
		}
		static TypeDef GetEnumTypeDef(TypeSig type) {
			if (type == null)
				return null;
			var td = GetTypeDef(type);
			if (td == null)
				return null;
			if (!td.IsEnum)
				return null;
			return td;
		}
Beispiel #6
0
    MethodDecl(
        Identifier idName,
        TypeSig tRetType,            
        ParamVarDecl[] arParams,
        BlockStatement stmtBody,
        Modifiers mods
        )
    {
        //m_strName       = idName.Text;
        m_idName        = idName;
        m_tRetType      = tRetType;
        
        m_mods          = mods;
        if (m_mods.IsAbstract && !m_mods.IsOverride)
            m_mods.SetVirtual();
        
        m_arParams      = (arParams != null) ? arParams : new ParamVarDecl[0];        
        m_stmtBody      = stmtBody;

        Debug.Assert(m_idName != null);        
        Debug.Assert((m_stmtBody != null) ^ mods.IsAbstract);
        Debug.Assert(m_arParams != null);        
        
        // @todo - this is wrong
        m_filerange = idName.Location;
    }
		/// <summary>
		/// Write a <see cref="TypeSig"/> signature
		/// </summary>
		/// <param name="helper">Helper</param>
		/// <param name="typeSig">The type</param>
		/// <returns>The signature as a byte array</returns>
		public static byte[] Write(ISignatureWriterHelper helper, TypeSig typeSig) {
			using (var writer = new SignatureWriter(helper)) {
				writer.Write(typeSig);
				return writer.GetResult();
			}
		}
Beispiel #8
0
 public static bool ContainsAnonymousType(this TypeSig type)
 {
     return(type.ContainsAnonymousType(0));
 }
Beispiel #9
0
        private static void SetupSignatureReferences(INameService service, ICollection <ModuleDefMD> modules, ModuleDef module, TypeSig typeSig)
        {
            var asTypeRef = typeSig.TryGetTypeRef();

            if (asTypeRef != null)
            {
                SetupTypeReference(service, modules, module, asTypeRef);
            }
        }
Beispiel #10
0
 public InstructionPushPopInfo(int pops, TypeSig pushType)
 {
     this.PopCount = pops;
     this.Pushes   = true;
     this.PushType = pushType;
 }
Beispiel #11
0
        void AddPushDefaultValue(int count, ref int index, TypeSig pushType)
        {
            pushType = pushType.RemovePinned();
            switch (count > 10 ? ElementType.End : pushType.RemovePinnedAndModifiers().GetElementType())
            {
            case ElementType.Void:
                break;

            case ElementType.Boolean:
            case ElementType.Char:
            case ElementType.I1:
            case ElementType.U1:
            case ElementType.I2:
            case ElementType.U2:
            case ElementType.I4:
            case ElementType.U4:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldc_I4_0));
                break;

            case ElementType.I8:
            case ElementType.U8:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldc_I4_0));
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Conv_I8));
                break;

            case ElementType.R4:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldc_R4));
                break;

            case ElementType.R8:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldc_R8));
                break;

            case ElementType.I:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldc_I4_0));
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Conv_I));
                break;

            case ElementType.U:
            case ElementType.Ptr:
            case ElementType.FnPtr:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldc_I4_0));
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Conv_U));
                break;

            case ElementType.ValueType:
                var td = ((ValueTypeSig)pushType).TypeDefOrRef.ResolveTypeDef();
                if (td != null && td.IsEnum)
                {
                    var undType = td.GetEnumUnderlyingType().RemovePinnedAndModifiers();
                    var et      = undType.GetElementType();
                    if ((ElementType.Boolean <= et && et <= ElementType.R8) || et == ElementType.I || et == ElementType.U)
                    {
                        AddPushDefaultValue(count + 1, ref index, undType);
                        break;
                    }
                }
                goto case ElementType.TypedByRef;

            case ElementType.TypedByRef:
            case ElementType.Var:
            case ElementType.MVar:
                var local = new LocalVM(typeSigCreatorOptions, new LocalOptions(new Local(pushType)));
                this.LocalsListVM.Add(local);

                var newInstr = CreateInstructionVM(Code.Ldloca);
                newInstr.InstructionOperandVM.OperandListItem = local;
                InstructionsListVM.Insert(index++, newInstr);

                newInstr = CreateInstructionVM(Code.Initobj);
                newInstr.InstructionOperandVM.Other = local.Type.ToTypeDefOrRef();
                InstructionsListVM.Insert(index++, newInstr);

                newInstr = CreateInstructionVM(Code.Ldloc);
                newInstr.InstructionOperandVM.OperandListItem = local;
                InstructionsListVM.Insert(index++, newInstr);
                break;

            case ElementType.GenericInst:
                if (((GenericInstSig)pushType).GenericType is ValueTypeSig)
                {
                    goto case ElementType.TypedByRef;
                }
                goto case ElementType.Class;

            case ElementType.End:
            case ElementType.String:
            case ElementType.ByRef:
            case ElementType.Class:
            case ElementType.Array:
            case ElementType.ValueArray:
            case ElementType.R:
            case ElementType.Object:
            case ElementType.SZArray:
            case ElementType.CModReqd:
            case ElementType.CModOpt:
            case ElementType.Internal:
            case ElementType.Module:
            case ElementType.Sentinel:
            case ElementType.Pinned:
            default:
                InstructionsListVM.Insert(index++, CreateInstructionVM(Code.Ldnull));
                break;
            }
        }
Beispiel #12
0
 public InstructionPushPopInfo(int pops)
 {
     this.PopCount = pops;
     this.Pushes   = false;
     this.PushType = null;
 }
Beispiel #13
0
 public static CachedOutput CreateConstant(TypeSig type, object c, TypePrinterFlags flags)
 {
     return(TypePrinterUtils.WriteConstant(new TypeOutput(), type, c, flags).cachedOutput);
 }
Beispiel #14
0
 public static ITypeDefOrRef GetElementType(this TypeSig signature)
 {
     return(signature.GetNonNestedTypeRefScope());
 }
Beispiel #15
0
    public FieldDecl(
        Identifier idName, 
        TypeSig tType,
        Modifiers mods,
        Exp exp // optional, may be null
    )
    {
        m_stName = idName.Text;
        m_tType = tType;        
        m_mods = mods;
        m_expInit = exp;

        Debug.Assert(m_tType != null);
        
        //m_filerange = FileRange.Merge(tType.Location, idName.Location);
    }
Beispiel #16
0
 static bool CheckClass(TypeSig type, string fullName)
 {
     return(type != null && (type.ElementType == ElementType.Object || type.FullName == fullName));
 }
Beispiel #17
0
 public PropertyDecl(
     Identifier idName, TypeSig tType,
     ParamVarDecl param, // optional param, may be null
     BlockStatement stmtGet, bool fHasGet,
     BlockStatement stmtSet, bool fHasSet,
     Modifiers mods
 )
 {
     m_stmtGet = stmtGet;
     m_stmtSet = stmtSet;
     
     m_idName = idName;
     m_tType = tType;
     
     Debug.Assert(idName != null);
     Debug.Assert(tType != null);
     Debug.Assert(fHasGet || fHasSet);
             
     m_mods = mods;
     
     //m_expParam = expParam;
             
     // Spoof bodies. Note that we just pass the attributes (static, virtual)
     // right to the new methods. Also, if we're abstract, the XXXStmt will be null
     // and the methods will just deal with that too.
     if (fHasGet)
     {
         Debug.Assert(mods.IsAbstract ^ (stmtGet != null));
     
         // T get_XXX();
         Identifier idName2 = new Identifier("get_"+Name.Text, m_idName.Location);
         m_declGet = new MethodDecl(
             idName2,
             m_tType,
             (param == null) ? 
                 new ParamVarDecl[0] : 
                 new ParamVarDecl[] { param }, 
             GetStmt, 
             mods
         );
     }
     
     if (fHasSet)
     {
         Debug.Assert(mods.IsAbstract ^ (stmtSet != null));
         
         // void set_XXX(T value);
         Identifier idP1 = new Identifier("value", new FileRange());
         
         ParamVarDecl T = new ParamVarDecl(idP1, (NonRefTypeSig) m_tType, EArgFlow.cIn);
         
         ParamVarDecl [] p = (param == null) ? 
             new ParamVarDecl[] { T } :
             new ParamVarDecl[] { param, T };
         
         Identifier idName2 = new Identifier("set_"+Name.Text, m_idName.Location);
         AST.TypeSig tVoid = new SimpleTypeSig(new SimpleObjExp(new Identifier("void", new FileRange())));
         //AST.TypeSig tVoid = new ResolvedTypeSig(typeof(void), s);
         m_declSet = new MethodDecl(idName2, tVoid,p, SetStmt, mods);
     }        
 }
Beispiel #18
0
 static bool IsStringType(TypeSig type)
 {
     return(type != null && (type.ElementType == ElementType.Object || type.ElementType == ElementType.String));
 }
Beispiel #19
0
 public VarDecl(Identifier idName, TypeSig tType)
 {
     m_tType = tType;
     m_stName = idName.Text;
     
     //m_filerange = FileRange.Merge(tType.Location, idName.Location);
 }
Beispiel #20
0
        IList <MethodSig> PossibleMethodSigs(ITypeDefOrRef declaringType, MethodSig sig, MethodData data)
        {
            // Setup generic types
            IList <TypeSig> typeGenerics = new List <TypeSig>(), methodGenerics = new List <TypeSig>();

            // Add all declaring spec generic types
            TypeSpec declaringSpec = declaringType as TypeSpec;

            if (declaringSpec != null)
            {
                var genericInstSig = declaringSpec.TryGetGenericInstSig();
                foreach (var garg in genericInstSig.GenericArguments)
                {
                    typeGenerics.Add(garg);
                }
            }

            // Add all method generic types
            if (data.HasGenericArguments)
            {
                foreach (var operand in data.GenericArguments)
                {
                    var gtype = this.ResolveType_NoLock(operand.Position);
                    methodGenerics.Add(gtype.ToTypeSig());
                }
            }

            // Todo: Combinations factoring in the possibility that return type might match
            // a generic type
            TypeSig         returnType  = ResolveType(data.ReturnType);
            IList <TypeSig> returnTypes = GenericUtils.PossibleTypeSigs(returnType, typeGenerics, methodGenerics);

            TypeSig[] paramTypes = new TypeSig[data.Parameters.Length];
            for (Int32 i = 0; i < paramTypes.Length; i++)
            {
                paramTypes[i] = ResolveType(data.Parameters[i]);
            }

            UInt32 genericTypeCount = (UInt32)data.GenericArguments.Length;

            IList <MethodSig> signatures = new List <MethodSig>();
            var paramCombos = GenericUtils.CreateGenericParameterCombinations(paramTypes, typeGenerics, methodGenerics);

            foreach (var rType in returnTypes)
            {
                foreach (var combo in paramCombos)
                {
                    var paramCombo = combo.ToArray();

                    MethodSig methodSig;

                    if (genericTypeCount == 0)
                    {
                        if (data.IsStatic)
                        {
                            methodSig = MethodSig.CreateStatic(rType, paramCombo);
                        }
                        else
                        {
                            methodSig = MethodSig.CreateInstance(rType, paramCombo);
                        }
                    }
                    else
                    {
                        if (data.IsStatic)
                        {
                            methodSig = MethodSig.CreateStaticGeneric(genericTypeCount, rType, paramCombo);
                        }
                        else
                        {
                            methodSig = MethodSig.CreateInstanceGeneric(genericTypeCount, rType, paramCombo);
                        }
                    }

                    signatures.Add(methodSig);
                }
            }

            return(signatures);
        }
		TypeSig FixTypeSig(TypeSig type) {
			return SubstituteGenericParameter(type.RemoveModifiers()).RemoveModifiers();
		}
Beispiel #22
0
 static bool Equals(TypeSig ts1, TypeSig ts2)
 {
     return(new TypeComparer().Equals(ts1, ts2));
 }
		/// <summary>
		/// Write a value
		/// </summary>
		/// <param name="argType">The ctor arg type, field type, or property type</param>
		/// <param name="value">The value to write</param>
		void WriteElem(TypeSig argType, CAArgument value) {
			if (argType == null) {
				helper.Error("Arg type is null");
				argType = value.Type;
				if (argType == null)
					return;
			}
			if (!recursionCounter.Increment()) {
				helper.Error("Infinite recursion");
				return;
			}

			TypeSig underlyingType;
			ITypeDefOrRef tdr;
			switch (argType.ElementType) {
			case ElementType.Boolean:
				if (!VerifyTypeAndValue(value, ElementType.Boolean))
					writer.Write(ToUInt64(value.Value) != 0);
				else
					writer.Write((bool)value.Value);
				break;

			case ElementType.Char:
				if (!VerifyTypeAndValue(value, ElementType.Char))
					writer.Write((ushort)ToUInt64(value.Value));
				else
					writer.Write((ushort)(char)value.Value);
				break;

			case ElementType.I1:
				if (!VerifyTypeAndValue(value, ElementType.I1))
					writer.Write((sbyte)ToUInt64(value.Value));
				else
					writer.Write((sbyte)value.Value);
				break;

			case ElementType.U1:
				if (!VerifyTypeAndValue(value, ElementType.U1))
					writer.Write((byte)ToUInt64(value.Value));
				else
					writer.Write((byte)value.Value);
				break;

			case ElementType.I2:
				if (!VerifyTypeAndValue(value, ElementType.I2))
					writer.Write((short)ToUInt64(value.Value));
				else
					writer.Write((short)value.Value);
				break;

			case ElementType.U2:
				if (!VerifyTypeAndValue(value, ElementType.U2))
					writer.Write((ushort)ToUInt64(value.Value));
				else
					writer.Write((ushort)value.Value);
				break;

			case ElementType.I4:
				if (!VerifyTypeAndValue(value, ElementType.I4))
					writer.Write((int)ToUInt64(value.Value));
				else
					writer.Write((int)value.Value);
				break;

			case ElementType.U4:
				if (!VerifyTypeAndValue(value, ElementType.U4))
					writer.Write((uint)ToUInt64(value.Value));
				else
					writer.Write((uint)value.Value);
				break;

			case ElementType.I8:
				if (!VerifyTypeAndValue(value, ElementType.I8))
					writer.Write((long)ToUInt64(value.Value));
				else
					writer.Write((long)value.Value);
				break;

			case ElementType.U8:
				if (!VerifyTypeAndValue(value, ElementType.U8))
					writer.Write(ToUInt64(value.Value));
				else
					writer.Write((ulong)value.Value);
				break;

			case ElementType.R4:
				if (!VerifyTypeAndValue(value, ElementType.R4))
					writer.Write((float)ToDouble(value.Value));
				else
					writer.Write((float)value.Value);
				break;

			case ElementType.R8:
				if (!VerifyTypeAndValue(value, ElementType.R8))
					writer.Write(ToDouble(value.Value));
				else
					writer.Write((double)value.Value);
				break;

			case ElementType.String:
				if (VerifyTypeAndValue(value, ElementType.String, typeof(UTF8String)))
					WriteUTF8String((UTF8String)value.Value);
				else if (VerifyTypeAndValue(value, ElementType.String, typeof(string)))
					WriteUTF8String((string)value.Value);
				else
					WriteUTF8String(UTF8String.Empty);
				break;

			case ElementType.ValueType:
				tdr = ((TypeDefOrRefSig)argType).TypeDefOrRef;
				underlyingType = GetEnumUnderlyingType(argType);
				if (underlyingType != null)
					WriteElem(underlyingType, value);
				else if (tdr is TypeRef && TryWriteEnumUnderlyingTypeValue(value.Value)) {
					// No error. Assume it's an enum that couldn't be resolved.
				}
				else
					helper.Error("Custom attribute value is not an enum");
				break;

			case ElementType.Class:
				tdr = ((TypeDefOrRefSig)argType).TypeDefOrRef;
				if (CheckCorLibType(argType, "Type")) {
					if (CheckCorLibType(value.Type, "Type")) {
						var ts = value.Value as TypeSig;
						if (ts != null)
							WriteType(ts);
						else {
							helper.Error("CA value is not a type");
							WriteUTF8String(UTF8String.Empty);
						}
					}
					else {
						helper.Error("CA value type is not System.Type");
						WriteUTF8String(UTF8String.Empty);
					}
					break;
				}
				else if (tdr is TypeRef && TryWriteEnumUnderlyingTypeValue(value.Value)) {
					// No error. Assume it's an enum that couldn't be resolved.
					break;
				}
				goto default;

			case ElementType.SZArray:
				WriteValue(argType, value);
				break;

			case ElementType.Object:
				WriteFieldOrPropType(value.Type);
				WriteElem(value.Type, value);
				break;

			case ElementType.End:
			case ElementType.Void:
			case ElementType.Ptr:
			case ElementType.ByRef:
			case ElementType.Var:
			case ElementType.Array:
			case ElementType.GenericInst:
			case ElementType.TypedByRef:
			case ElementType.ValueArray:
			case ElementType.I:
			case ElementType.U:
			case ElementType.R:
			case ElementType.FnPtr:
			case ElementType.MVar:
			case ElementType.CModReqd:
			case ElementType.CModOpt:
			case ElementType.Internal:
			case ElementType.Module:
			case ElementType.Sentinel:
			case ElementType.Pinned:
			default:
				helper.Error("Invalid or unsupported element type in custom attribute");
				break;
			}

			recursionCounter.Decrement();
		}
        /// <summary>
        /// Gets the types to push onto the stack from an instruction. Should
        /// be run before popping.
        /// </summary>
        /// <param name="instr">Instruction</param>
        /// <param name="state">Current stack state</param>
        /// <returns>Types to push</returns>
        IList <TypeSig> PushTypes(Instruction instr, Stack <TypeSig> state)
        {
            var module = this.Method.Module;
            var list   = new List <TypeSig>();

            switch (instr.OpCode.StackBehaviourPush)
            {
            case StackBehaviour.Push0:
            default:
                break;

            case StackBehaviour.Push1:
                TypeSig type;
                if ((type = this.LdargType(instr)) != null ||
                    (type = this.LdlocType(instr)) != null ||
                    (type = this.MathType(instr, state)) != null)
                {
                    list.Add(type);
                }
                else if (instr.OpCode.Code == Code.Ldfld || instr.OpCode.Code == Code.Ldsfld)
                {
                    list.Add((instr.Operand as IField).FieldSig.Type);
                }
                else
                {
                    throw new Exception(String.Format("Unknown type pushed by Push1 instruction: {0}", instr));
                }
                break;

            case StackBehaviour.Push1_push1:
                // Only Dup has Push1_Push1 behaviour
                if (instr.OpCode.Code == Code.Dup)
                {
                    // Assumes value hasn't yet been popped: Will need to make sure that
                    // this method is run before popping
                    list.Add(state.Peek());
                    list.Add(state.Peek());
                }
                break;

            case StackBehaviour.Pushi:
                list.Add(module.CorLibTypes.Int32);
                break;

            case StackBehaviour.Pushi8:
                list.Add(module.CorLibTypes.Int64);
                break;

            case StackBehaviour.Pushr4:
                list.Add(module.CorLibTypes.Single);
                break;

            case StackBehaviour.Pushr8:
                list.Add(module.CorLibTypes.Double);
                break;

            case StackBehaviour.Pushref:
                if (instr.OpCode.Code == Code.Ldstr)
                {
                    list.Add(module.CorLibTypes.String);
                }
                else if (instr.OpCode.Code == Code.Ldind_Ref)
                {
                    list.Add(state.Peek().Next);
                }
                else if (instr.OpCode.Code == Code.Newobj)
                {
                    var method = (instr.Operand as IMethod).ResolveMethodDefThrow();
                    if (instr.OpCode.Code == Code.Newobj)
                    {
                        list.Add(method.DeclaringType.ToTypeSig());
                    }
                }
                else
                {
                    list.Add(module.CorLibTypes.Object);                          // Object by default
                }
                break;

            case StackBehaviour.Varpush:
                if (instr.Operand is IMethod)
                {
                    TypeSig returnType = (instr.Operand as IMethod).ResolveMethodDefThrow().ReturnType;
                    if (returnType != null && !returnType.FullName.Equals("System.Void"))
                    {
                        list.Add(returnType);
                    }
                }
                break;
            }

            return(list);
        }
		void WriteFieldOrPropType(TypeSig type) {
			type = type.RemoveModifiers();
			if (type == null) {
				helper.Error("Field/property type is null");
				return;
			}
			if (!recursionCounter.Increment()) {
				helper.Error("Infinite recursion");
				return;
			}

			ITypeDefOrRef tdr;
			switch (type.ElementType) {
			case ElementType.Boolean:	writer.Write((byte)SerializationType.Boolean); break;
			case ElementType.Char:		writer.Write((byte)SerializationType.Char); break;
			case ElementType.I1:		writer.Write((byte)SerializationType.I1); break;
			case ElementType.U1:		writer.Write((byte)SerializationType.U1); break;
			case ElementType.I2:		writer.Write((byte)SerializationType.I2); break;
			case ElementType.U2:		writer.Write((byte)SerializationType.U2); break;
			case ElementType.I4:		writer.Write((byte)SerializationType.I4); break;
			case ElementType.U4:		writer.Write((byte)SerializationType.U4); break;
			case ElementType.I8:		writer.Write((byte)SerializationType.I8); break;
			case ElementType.U8:		writer.Write((byte)SerializationType.U8); break;
			case ElementType.R4:		writer.Write((byte)SerializationType.R4); break;
			case ElementType.R8:		writer.Write((byte)SerializationType.R8); break;
			case ElementType.String:	writer.Write((byte)SerializationType.String); break;
			case ElementType.Object:	writer.Write((byte)SerializationType.TaggedObject); break;

			case ElementType.SZArray:
				writer.Write((byte)SerializationType.SZArray);
				WriteFieldOrPropType(type.Next);
				break;

			case ElementType.Class:
				tdr = ((TypeDefOrRefSig)type).TypeDefOrRef;
				if (CheckCorLibType(type, "Type"))
					writer.Write((byte)SerializationType.Type);
				else if (tdr is TypeRef) {
					// Could be an enum TypeRef that couldn't be resolved, so the code
					// assumed it's a class and created a ClassSig.
					writer.Write((byte)SerializationType.Enum);
					WriteType(tdr);
				}
				else
					goto default;
				break;

			case ElementType.ValueType:
				tdr = ((TypeDefOrRefSig)type).TypeDefOrRef;
				var enumType = GetEnumTypeDef(type);
				// If TypeRef => assume it's an enum that couldn't be resolved
				if (enumType != null || tdr is TypeRef) {
					writer.Write((byte)SerializationType.Enum);
					WriteType(tdr);
				}
				else {
					helper.Error("Custom attribute type doesn't seem to be an enum.");
					writer.Write((byte)SerializationType.Enum);
					WriteType(tdr);
				}
				break;

			default:
				helper.Error("Invalid type");
				writer.Write((byte)0xFF);
				break;
			}

			recursionCounter.Decrement();
		}
Beispiel #26
0
 void InitializeFrom(CAArgument arg, TypeSig storageType)
 {
     StorageType          = storageType;
     ConstantTypeVM.Value = ConvertFromModel(arg.Type, arg.Value);
 }
Beispiel #27
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="name">Name of constant</param>
 /// <param name="type">Type of constant</param>
 /// <param name="value">Constant value</param>
 public MethodDebugConstant(string name, TypeSig type, object value)
 {
     Name  = name ?? throw new ArgumentNullException(nameof(name));
     Type  = type ?? throw new ArgumentNullException(nameof(type));
     Value = value;
 }
Beispiel #28
0
        object ConvertFromModel(TypeSig valueType, object value)
        {
            var           type = valueType.RemovePinnedAndModifiers();
            var           et   = type.GetElementType();
            ITypeDefOrRef tdr;
            TypeDef       td;

            switch (et)
            {
            case ElementType.Boolean:
            case ElementType.Char:
            case ElementType.I1:
            case ElementType.U1:
            case ElementType.I2:
            case ElementType.U2:
            case ElementType.I4:
            case ElementType.U4:
            case ElementType.I8:
            case ElementType.U8:
            case ElementType.R4:
            case ElementType.R8:
                if (ModelUtils.GetElementType(value?.GetType()) == et)
                {
                    return(value);
                }
                break;

            case ElementType.String:
                if (value == null)
                {
                    return(Null <string> .Instance);
                }
                else if (value is string)
                {
                    return(value);
                }
                else if (value is UTF8String)
                {
                    return(((UTF8String)value).String);
                }
                break;

            case ElementType.ValueType:
            case ElementType.Class:
                tdr = ((ClassOrValueTypeSig)type).TypeDefOrRef;
                if (tdr.IsSystemType())
                {
                    if (value == null)
                    {
                        return(Null <TypeSig> .Instance);
                    }
                    return(value);
                }
                td = tdr.ResolveTypeDef();
                if (td != null && !td.IsEnum)
                {
                    break;
                }
                return(new EnumInfo()
                {
                    EnumType = tdr,
                    Value = value,
                    IsArray = false,
                });

            case ElementType.SZArray:
                var elemType = type.Next.RemovePinnedAndModifiers();
                if (value == null)
                {
                    switch (elemType.GetElementType())
                    {
                    case ElementType.Boolean:       return(Null <bool[]> .Instance);

                    case ElementType.Char:          return(Null <char[]> .Instance);

                    case ElementType.I1:            return(Null <sbyte[]> .Instance);

                    case ElementType.U1:            return(Null <byte[]> .Instance);

                    case ElementType.I2:            return(Null <short[]> .Instance);

                    case ElementType.U2:            return(Null <ushort[]> .Instance);

                    case ElementType.I4:            return(Null <int[]> .Instance);

                    case ElementType.U4:            return(Null <uint[]> .Instance);

                    case ElementType.I8:            return(Null <long[]> .Instance);

                    case ElementType.U8:            return(Null <ulong[]> .Instance);

                    case ElementType.R4:            return(Null <float[]> .Instance);

                    case ElementType.R8:            return(Null <double[]> .Instance);

                    case ElementType.String:        return(Null <string[]> .Instance);

                    case ElementType.Object:        return(Null <object[]> .Instance);

                    case ElementType.ValueType:
                    case ElementType.Class:
                        tdr = ((ClassOrValueTypeSig)elemType).TypeDefOrRef;
                        if (tdr.IsSystemType())
                        {
                            return(Null <Type[]> .Instance);
                        }
                        td = tdr.ResolveTypeDef();
                        if (td != null && !td.IsEnum)
                        {
                            break;
                        }
                        return(EnumInfo.CreateNullArray(tdr));
                    }
                    break;
                }
                var oldList = value as IList <CAArgument>;
                if (oldList == null)
                {
                    break;
                }

                switch (elemType.GetElementType())
                {
                case ElementType.Boolean:       return(ConvertArray <bool>(elemType, oldList));

                case ElementType.Char:          return(ConvertArray <char>(elemType, oldList));

                case ElementType.I1:            return(ConvertArray <sbyte>(elemType, oldList));

                case ElementType.U1:            return(ConvertArray <byte>(elemType, oldList));

                case ElementType.I2:            return(ConvertArray <short>(elemType, oldList));

                case ElementType.U2:            return(ConvertArray <ushort>(elemType, oldList));

                case ElementType.I4:            return(ConvertArray <int>(elemType, oldList));

                case ElementType.U4:            return(ConvertArray <uint>(elemType, oldList));

                case ElementType.I8:            return(ConvertArray <long>(elemType, oldList));

                case ElementType.U8:            return(ConvertArray <ulong>(elemType, oldList));

                case ElementType.R4:            return(ConvertArray <float>(elemType, oldList));

                case ElementType.R8:            return(ConvertArray <double>(elemType, oldList));

                case ElementType.String:        return(ConvertArray <string>(elemType, oldList));

                case ElementType.Object:        return(ConvertArray <object>(elemType, oldList));

                case ElementType.ValueType:
                case ElementType.Class:
                    tdr = ((ClassOrValueTypeSig)elemType).TypeDefOrRef;
                    if (tdr.IsSystemType())
                    {
                        return(ConvertArray <TypeSig>(elemType, oldList));
                    }
                    td = tdr.ResolveTypeDef();
                    if (td != null && !td.IsEnum)
                    {
                        break;
                    }
                    return(ConvertEnum(elemType, oldList));
                }
                break;

            default:
                break;
            }
            return(value);
        }
Beispiel #29
0
        Instruction LoadIndirect(TypeSig type)
        {
            switch (type.GetElementType())
            {
            case ElementType.Boolean:               return(Instruction.Create(OpCodes.Ldind_I1));

            case ElementType.Char:                  return(Instruction.Create(OpCodes.Ldind_U2));

            case ElementType.I1:                    return(Instruction.Create(OpCodes.Ldind_I1));

            case ElementType.U1:                    return(Instruction.Create(OpCodes.Ldind_U1));

            case ElementType.I2:                    return(Instruction.Create(OpCodes.Ldind_I2));

            case ElementType.U2:                    return(Instruction.Create(OpCodes.Ldind_U2));

            case ElementType.I4:                    return(Instruction.Create(OpCodes.Ldind_I4));

            case ElementType.U4:                    return(Instruction.Create(OpCodes.Ldind_U4));

            case ElementType.I8:                    return(Instruction.Create(OpCodes.Ldind_I8));

            case ElementType.U8:                    return(Instruction.Create(OpCodes.Ldind_I8));

            case ElementType.R4:                    return(Instruction.Create(OpCodes.Ldind_R4));

            case ElementType.R8:                    return(Instruction.Create(OpCodes.Ldind_R8));

            case ElementType.String:                return(Instruction.Create(OpCodes.Ldind_Ref));

            case ElementType.I:                             return(Instruction.Create(OpCodes.Ldind_I));

            case ElementType.U:                             return(Instruction.Create(OpCodes.Ldind_I));

            case ElementType.ValueType:             return(Instruction.Create(OpCodes.Ldobj, generatedModule.Import(type).ToTypeDefOrRef()));

            case ElementType.Class:                 return(Instruction.Create(OpCodes.Ldind_Ref));

            case ElementType.Array:                 return(Instruction.Create(OpCodes.Ldind_Ref));

            case ElementType.Object:                return(Instruction.Create(OpCodes.Ldind_Ref));

            case ElementType.SZArray:               return(Instruction.Create(OpCodes.Ldind_Ref));

            case ElementType.Ptr:                   return(Instruction.Create(OpCodes.Ldind_I));

            case ElementType.FnPtr:                 return(Instruction.Create(OpCodes.Ldind_I));

            case ElementType.Var:                   return(Instruction.Create(OpCodes.Ldobj, generatedModule.Import(type).ToTypeDefOrRef()));

            case ElementType.MVar:                  return(Instruction.Create(OpCodes.Ldobj, generatedModule.Import(type).ToTypeDefOrRef()));

            case ElementType.TypedByRef:    return(Instruction.Create(OpCodes.Ldobj, generatedModule.Import(type).ToTypeDefOrRef()));

            case ElementType.GenericInst:
                var gis = type as GenericInstSig;
                if (gis.GenericType.IsValueTypeSig)
                {
                    return(Instruction.Create(OpCodes.Ldobj, generatedModule.Import(type).ToTypeDefOrRef()));
                }
                return(Instruction.Create(OpCodes.Ldind_Ref));

            case ElementType.End:
            case ElementType.Void:
            case ElementType.ByRef:
            case ElementType.ValueArray:
            case ElementType.R:
            case ElementType.CModReqd:
            case ElementType.CModOpt:
            case ElementType.Internal:
            case ElementType.Module:
            case ElementType.Sentinel:
            case ElementType.Pinned:
            default:
                return(Instruction.Create(OpCodes.Nop));
            }
        }
Beispiel #30
0
        CAArgument CreateCAArgument(TypeSig ownerType, object value)
        {
            if (value == null || value is Null)
            {
                var t = ownerType.RemovePinnedAndModifiers();
                t = t is SZArraySig ? t.Next : t;
                if (t.RemovePinnedAndModifiers().GetElementType() == ElementType.Object)
                {
                    return(new CAArgument(module.CorLibTypes.String, null));
                }
                return(new CAArgument(ownerType, null));
            }

            switch (ModelUtils.GetElementType(value.GetType()))
            {
            case ElementType.Boolean: return(new CAArgument(module.CorLibTypes.Boolean, value));

            case ElementType.Char:  return(new CAArgument(module.CorLibTypes.Char, value));

            case ElementType.I1:    return(new CAArgument(module.CorLibTypes.SByte, value));

            case ElementType.U1:    return(new CAArgument(module.CorLibTypes.Byte, value));

            case ElementType.I2:    return(new CAArgument(module.CorLibTypes.Int16, value));

            case ElementType.U2:    return(new CAArgument(module.CorLibTypes.UInt16, value));

            case ElementType.I4:    return(new CAArgument(module.CorLibTypes.Int32, value));

            case ElementType.U4:    return(new CAArgument(module.CorLibTypes.UInt32, value));

            case ElementType.I8:    return(new CAArgument(module.CorLibTypes.Int64, value));

            case ElementType.U8:    return(new CAArgument(module.CorLibTypes.UInt64, value));

            case ElementType.R4:    return(new CAArgument(module.CorLibTypes.Single, value));

            case ElementType.R8:    return(new CAArgument(module.CorLibTypes.Double, value));

            case ElementType.String: return(new CAArgument(module.CorLibTypes.String, new UTF8String((string)value)));
            }
            if (value is TypeSig)
            {
                return(new CAArgument(new ClassSig(module.CorLibTypes.GetTypeRef("System", "Type")), value));
            }

            if (value is EnumInfo enumInfo)
            {
                var enumSig = enumInfo.EnumType.ToTypeSig();
                if (!enumInfo.IsArray)
                {
                    return(new CAArgument(enumSig, enumInfo.Value));
                }
                var res  = CreateArray(enumSig, enumInfo.Value);
                var list = (IList <CAArgument>)res.Value;
                if (list != null)
                {
                    for (int i = 0; i < list.Count; i++)
                    {
                        list[i] = new CAArgument(enumSig, list[i].Value);
                    }
                }
                return(res);
            }

            var valueType = value.GetType();

            if (value is IList <bool> )
            {
                return(CreateArray(module.CorLibTypes.Boolean, value));
            }
            if (value is IList <char> )
            {
                return(CreateArray(module.CorLibTypes.Char, value));
            }
            if (value is IList <sbyte> && valueType != typeof(byte[]))
            {
                return(CreateArray(module.CorLibTypes.SByte, value));
            }
            if (value is IList <short> && valueType != typeof(ushort[]))
            {
                return(CreateArray(module.CorLibTypes.Int16, value));
            }
            if (value is IList <int> && valueType != typeof(uint[]))
            {
                return(CreateArray(module.CorLibTypes.Int32, value));
            }
            if (value is IList <long> && valueType != typeof(ulong[]))
            {
                return(CreateArray(module.CorLibTypes.Int64, value));
            }
            if (value is IList <byte> && valueType != typeof(sbyte[]))
            {
                return(CreateArray(module.CorLibTypes.Byte, value));
            }
            if (value is IList <ushort> && valueType != typeof(short[]))
            {
                return(CreateArray(module.CorLibTypes.UInt16, value));
            }
            if (value is IList <uint> && valueType != typeof(int[]))
            {
                return(CreateArray(module.CorLibTypes.UInt32, value));
            }
            if (value is IList <ulong> && valueType != typeof(long[]))
            {
                return(CreateArray(module.CorLibTypes.UInt64, value));
            }
            if (value is IList <float> )
            {
                return(CreateArray(module.CorLibTypes.Single, value));
            }
            if (value is IList <double> )
            {
                return(CreateArray(module.CorLibTypes.Double, value));
            }
            if (value is IList <string> )
            {
                return(CreateArray(module.CorLibTypes.String, value));
            }
            if (value is IList <TypeSig> )
            {
                return(CreateArray(new ClassSig(module.CorLibTypes.GetTypeRef("System", "Type")), value));
            }
            if (value is IList <object> )
            {
                return(CreateArray(module.CorLibTypes.Object, value));
            }

            Debug.Fail(string.Format("Unknown CA arg: {0}, ownerType: {1}", value, ownerType));
            return(new CAArgument());
        }
		IList<TypeSig> GetLocals() {
			var localsSig = new TypeSig[cilBody.Variables.Count];
			for (int i = 0; i < cilBody.Variables.Count; i++)
				localsSig[i] = cilBody.Variables[i].Type;
			return localsSig;
		}
Beispiel #32
0
 public CAArgumentVM(ModuleDef ownerModule, CAArgument arg, TypeSigCreatorOptions options, TypeSig storageType)
 {
     module         = options.OwnerModule;
     originalArg    = arg.Clone();
     ConstantTypeVM = new DnlibDialogs.ConstantTypeVM(ownerModule, null, ConstantTypes, true, true, options);
     ConstantTypeVM.PropertyChanged += ConstantTypeVM_PropertyChanged;
     InitializeFrom(arg, storageType);
     modified = false;
 }
Beispiel #33
0
 // Name & type can't be null.
 // Must have at least Get or  Set be non-null
 public PropertyDecl(
     Identifier idName, TypeSig tType,        
     BlockStatement stmtGet, bool fHasGet,
     BlockStatement stmtSet, bool fHasSet,
     Modifiers mods
     ) : 
     this(
         idName, tType, 
         null,
         stmtGet, fHasGet,
         stmtSet, fHasSet,
         mods)            
 {
 
 }
Beispiel #34
0
 public Instructions Emit(OpCode opCode, TypeSig value)
 {
     return(Insert(Instruction.Create(opCode, value.ToTypeDefOrRef())));
 }
Beispiel #35
0
    MethodDecl(
        Identifier idName,        
        TypeSig tRetType,
        ParamVarDecl[] arParams
    )
    {
        //m_strName       = idName.Text;
        m_idName        = idName;
        m_tRetType      = tRetType;
        
        m_mods          =   new Modifiers();
        m_mods.SetAbstract();
        m_mods.SetVirtual();
        m_mods.SetPublic(); 
        
        m_arParams      = (arParams != null) ? arParams : new ParamVarDecl[0];        
        m_stmtBody      = null;

        Debug.Assert(m_idName != null);
        Debug.Assert(m_arParams != null);        
        
        // @todo - this is wrong
        m_filerange = idName.Location;
    }
Beispiel #36
0
 public static void WriteTo(this TypeSig type, ITextOutput writer, ILNameSyntax syntax = ILNameSyntax.Signature)
 {
     type.WriteTo(writer, syntax, 0);
 }
Beispiel #37
0
 // For overloaded operators
 // No modifiers needed since op overloading must be public & static.
 // Have a special constructor so that we can set the IsOp flag and
 // get a safe string name. 
 public MethodDecl(
     BinaryExp.BinaryOp op,
     TypeSig tRetType,
     ParamVarDecl[] arParams,
     BlockStatement stmtBody
 )
 {
     m_fIsOpOverload = true;
     string strName  = GetOpOverloadedName(op);
     m_idName        = new Identifier(strName, tRetType.Location);
     m_tRetType      = tRetType;
     m_arParams      = (arParams != null) ? arParams : new ParamVarDecl[0];        
     m_stmtBody      = stmtBody;
     
     //m_mods          = new Modifiers(Modifiers.EFlags.Public | Modifiers.EFlags.Static);
     m_mods = new Modifiers();
     m_mods.SetPublic();
     m_mods.SetStatic();
     
     Debug.Assert(m_idName != null);        
     Debug.Assert(m_stmtBody != null);
     Debug.Assert(m_arParams != null);
 }
Beispiel #38
0
        public static void WriteTo(this TypeSig type, ITextOutput writer, ILNameSyntax syntax, int depth)
        {
            if (depth++ > MAX_CONVERTTYPE_DEPTH)
            {
                return;
            }
            ILNameSyntax syntaxForElementTypes = syntax == ILNameSyntax.SignatureNoNamedTypeParameters ? syntax : ILNameSyntax.Signature;

            if (type is PinnedSig)
            {
                ((PinnedSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.WriteSpace();
                writer.Write("pinned", TextTokenType.Keyword);
            }
            else if (type is ArraySig)
            {
                ArraySig at = (ArraySig)type;
                at.Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('[', TextTokenType.Operator);
                for (int i = 0; i < at.Rank; i++)
                {
                    if (i != 0)
                    {
                        writer.Write(',', TextTokenType.Operator);
                        writer.WriteSpace();
                    }
                    int? lower = i < at.LowerBounds.Count ? at.LowerBounds[i] : (int?)null;
                    uint?size  = i < at.Sizes.Count ? at.Sizes[i] : (uint?)null;
                    if (lower != null)
                    {
                        writer.Write(lower.ToString(), TextTokenType.Number);
                        if (size != null)
                        {
                            writer.Write("..", TextTokenType.Operator);
                            writer.Write((lower.Value + (int)size.Value - 1).ToString(), TextTokenType.Number);
                        }
                        else
                        {
                            writer.Write("...", TextTokenType.Operator);
                        }
                    }
                }
                writer.Write(']', TextTokenType.Operator);
            }
            else if (type is SZArraySig)
            {
                SZArraySig at = (SZArraySig)type;
                at.Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write("[]", TextTokenType.Operator);
            }
            else if (type is GenericSig)
            {
                if (((GenericSig)type).IsMethodVar)
                {
                    writer.Write("!!", TextTokenType.Operator);
                }
                else
                {
                    writer.Write("!", TextTokenType.Operator);
                }
                string typeName = type.TypeName;
                if (string.IsNullOrEmpty(typeName) || typeName[0] == '!' || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                {
                    writer.Write(((GenericSig)type).Number.ToString(), TextTokenType.Number);
                }
                else
                {
                    writer.Write(Escape(typeName), TextTokenHelper.GetTextTokenType(type));
                }
            }
            else if (type is ByRefSig)
            {
                ((ByRefSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('&', TextTokenType.Operator);
            }
            else if (type is PtrSig)
            {
                ((PtrSig)type).Next.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('*', TextTokenType.Operator);
            }
            else if (type is GenericInstSig)
            {
                ((GenericInstSig)type).GenericType.WriteTo(writer, syntaxForElementTypes, depth);
                writer.Write('<', TextTokenType.Operator);
                var arguments = ((GenericInstSig)type).GenericArguments;
                for (int i = 0; i < arguments.Count; i++)
                {
                    if (i > 0)
                    {
                        writer.Write(',', TextTokenType.Operator);
                        writer.WriteSpace();
                    }
                    arguments[i].WriteTo(writer, syntaxForElementTypes, depth);
                }
                writer.Write('>', TextTokenType.Operator);
            }
            else if (type is CModOptSig)
            {
                ((ModifierSig)type).Next.WriteTo(writer, syntax, depth);
                writer.WriteSpace();
                writer.Write("modopt", TextTokenType.Keyword);
                writer.Write('(', TextTokenType.Operator);
                ((ModifierSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName, depth);
                writer.Write(')', TextTokenType.Operator);
                writer.WriteSpace();
            }
            else if (type is CModReqdSig)
            {
                ((ModifierSig)type).Next.WriteTo(writer, syntax, depth);
                writer.WriteSpace();
                writer.Write("modreq", TextTokenType.Keyword);
                writer.Write('(', TextTokenType.Operator);
                ((ModifierSig)type).Modifier.WriteTo(writer, ILNameSyntax.TypeName, depth);
                writer.Write(')', TextTokenType.Operator);
                writer.WriteSpace();
            }
            else if (type is TypeDefOrRefSig)
            {
                WriteTo(((TypeDefOrRefSig)type).TypeDefOrRef, writer, syntax, depth);
            }
            else if (type is FnPtrSig)
            {
                WriteTo(type.ToTypeDefOrRef(), writer, syntax, depth);
            }
            //TODO: SentinelSig
        }
Beispiel #39
0
 public LocalVarDecl(Identifier idName, TypeSig tType) : base(idName, tType)
 {
     m_symbol = new LocalVarExpEntry();
 }
Beispiel #40
0
        public static void WriteTo(this ITypeDefOrRef type, ITextOutput writer, ILNameSyntax syntax, int depth)
        {
            if (depth++ > MAX_CONVERTTYPE_DEPTH || type == null)
            {
                return;
            }
            var ts = type as TypeSpec;

            if (ts != null && !(ts.TypeSig is FnPtrSig))
            {
                WriteTo(((TypeSpec)type).TypeSig, writer, syntax, depth);
                return;
            }
            string typeFullName = type.FullName;
            string typeName     = type.Name.String;

            if (ts != null)
            {
                var fnPtrSig = ts.TypeSig as FnPtrSig;
                typeFullName = DnlibExtensions.GetFnPtrFullName(fnPtrSig);
                typeName     = DnlibExtensions.GetFnPtrName(fnPtrSig);
            }
            TypeSig typeSig = null;
            string  name    = type.DefinitionAssembly.IsCorLib() ? PrimitiveTypeName(typeFullName, type.Module, out typeSig) : null;

            if (syntax == ILNameSyntax.ShortTypeName)
            {
                if (name != null)
                {
                    WriteKeyword(writer, name, typeSig.ToTypeDefOrRef());
                }
                else
                {
                    writer.WriteReference(Escape(typeName), type, TextTokenHelper.GetTextTokenType(type));
                }
            }
            else if ((syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters) && name != null)
            {
                WriteKeyword(writer, name, typeSig.ToTypeDefOrRef());
            }
            else
            {
                if (syntax == ILNameSyntax.Signature || syntax == ILNameSyntax.SignatureNoNamedTypeParameters)
                {
                    writer.Write(DnlibExtensions.IsValueType(type) ? "valuetype" : "class", TextTokenType.Keyword);
                    writer.WriteSpace();
                }

                if (type.DeclaringType != null)
                {
                    type.DeclaringType.WriteTo(writer, ILNameSyntax.TypeName, depth);
                    writer.Write('/', TextTokenType.Operator);
                    writer.WriteReference(Escape(typeName), type, TextTokenHelper.GetTextTokenType(type));
                }
                else
                {
                    if (!(type is TypeDef) && type.Scope != null && !(type is TypeSpec))
                    {
                        writer.Write('[', TextTokenType.Operator);
                        writer.Write(Escape(type.Scope.GetScopeName()), TextTokenType.ILModule);
                        writer.Write(']', TextTokenType.Operator);
                    }
                    if (ts != null || MustEscape(typeFullName))
                    {
                        writer.WriteReference(Escape(typeFullName), type, TextTokenHelper.GetTextTokenType(type));
                    }
                    else
                    {
                        WriteNamespace(writer, type.Namespace);
                        if (!string.IsNullOrEmpty(type.Namespace))
                        {
                            writer.Write('.', TextTokenType.Operator);
                        }
                        writer.WriteReference(IdentifierEscaper.Escape(type.Name), type, TextTokenHelper.GetTextTokenType(type));
                    }
                }
            }
        }
		void Write(TypeSig typeSig) {
			const ElementType DEFAULT_ELEMENT_TYPE = ElementType.Boolean;
			if (typeSig == null) {
				helper.Error("TypeSig is null");
				writer.Write((byte)DEFAULT_ELEMENT_TYPE);
				return;
			}
			if (!recursionCounter.Increment()) {
				helper.Error("Infinite recursion");
				writer.Write((byte)DEFAULT_ELEMENT_TYPE);
				return;
			}

			uint count;
			switch (typeSig.ElementType) {
			case ElementType.Void:
			case ElementType.Boolean:
			case ElementType.Char:
			case ElementType.I1:
			case ElementType.U1:
			case ElementType.I2:
			case ElementType.U2:
			case ElementType.I4:
			case ElementType.U4:
			case ElementType.I8:
			case ElementType.U8:
			case ElementType.R4:
			case ElementType.R8:
			case ElementType.String:
			case ElementType.TypedByRef:
			case ElementType.I:
			case ElementType.U:
			case ElementType.Object:
			case ElementType.Sentinel:
				writer.Write((byte)typeSig.ElementType);
				break;

			case ElementType.Ptr:
			case ElementType.ByRef:
			case ElementType.SZArray:
			case ElementType.Pinned:
				writer.Write((byte)typeSig.ElementType);
				Write(typeSig.Next);
				break;

			case ElementType.ValueType:
			case ElementType.Class:
				writer.Write((byte)typeSig.ElementType);
				Write(((TypeDefOrRefSig)typeSig).TypeDefOrRef);
				break;

			case ElementType.Var:
			case ElementType.MVar:
				writer.Write((byte)typeSig.ElementType);
				WriteCompressedUInt32(((GenericSig)typeSig).Number);
				break;

			case ElementType.Array:
				writer.Write((byte)typeSig.ElementType);
				var ary = (ArraySig)typeSig;
				Write(ary.Next);
				WriteCompressedUInt32(ary.Rank);
				if (ary.Rank == 0)
					break;
				count = WriteCompressedUInt32((uint)ary.Sizes.Count);
				for (uint i = 0; i < count; i++)
					WriteCompressedUInt32(ary.Sizes[(int)i]);
				count = WriteCompressedUInt32((uint)ary.LowerBounds.Count);
				for (uint i = 0; i < count; i++)
					WriteCompressedInt32(ary.LowerBounds[(int)i]);
				break;

			case ElementType.GenericInst:
				writer.Write((byte)typeSig.ElementType);
				var gis = (GenericInstSig)typeSig;
				Write(gis.GenericType);
				count = WriteCompressedUInt32((uint)gis.GenericArguments.Count);
				for (uint i = 0; i < count; i++)
					Write(gis.GenericArguments[(int)i]);
				break;

			case ElementType.ValueArray:
				writer.Write((byte)typeSig.ElementType);
				Write(typeSig.Next);
				WriteCompressedUInt32((typeSig as ValueArraySig).Size);
				break;

			case ElementType.FnPtr:
				writer.Write((byte)typeSig.ElementType);
				Write((typeSig as FnPtrSig).Signature);
				break;

			case ElementType.CModReqd:
			case ElementType.CModOpt:
				writer.Write((byte)typeSig.ElementType);
				Write((typeSig as ModifierSig).Modifier);
				Write(typeSig.Next);
				break;

			case ElementType.Module:
				writer.Write((byte)typeSig.ElementType);
				WriteCompressedUInt32((typeSig as ModuleSig).Index);
				Write(typeSig.Next);
				break;

			case ElementType.End:
			case ElementType.R:
			case ElementType.Internal:
			default:
				helper.Error("Unknown or unsupported element type");
				writer.Write((byte)DEFAULT_ELEMENT_TYPE);
				break;
			}

			recursionCounter.Decrement();
		}
Beispiel #42
0
        public static string PrimitiveTypeName(string fullName, ModuleDef module, out TypeSig typeSig)
        {
            var corLibTypes = module == null ? null : module.CorLibTypes;

            typeSig = null;
            switch (fullName)
            {
            case "System.SByte":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.SByte;
                }
                return("int8");

            case "System.Int16":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Int16;
                }
                return("int16");

            case "System.Int32":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Int32;
                }
                return("int32");

            case "System.Int64":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Int64;
                }
                return("int64");

            case "System.Byte":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Byte;
                }
                return("uint8");

            case "System.UInt16":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.UInt16;
                }
                return("uint16");

            case "System.UInt32":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.UInt32;
                }
                return("uint32");

            case "System.UInt64":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.UInt64;
                }
                return("uint64");

            case "System.Single":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Single;
                }
                return("float32");

            case "System.Double":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Double;
                }
                return("float64");

            case "System.Void":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Void;
                }
                return("void");

            case "System.Boolean":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Boolean;
                }
                return("bool");

            case "System.String":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.String;
                }
                return("string");

            case "System.Char":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Char;
                }
                return("char");

            case "System.Object":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.Object;
                }
                return("object");

            case "System.IntPtr":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.IntPtr;
                }
                return("native int");

            case "System.UIntPtr":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.UIntPtr;
                }
                return("native unsigned int");

            case "System.TypedReference":
                if (corLibTypes != null)
                {
                    typeSig = corLibTypes.TypedReference;
                }
                return("typedref");

            default:
                return(null);
            }
        }
		TypeSig SubstituteGenericParameter(TypeSig type) {
			if (genericArguments == null)
				return type;
			return genericArguments.Resolve(type);
		}
Beispiel #44
0
 public T Write <T>(T output, TypeSig type, TypePrinterFlags flags) where T : ITypeOutput
 {
     new TypePrinter(output, flags).Write(type, TypeParameters.ToArray());
     return(output);
 }
		static bool VerifyType(TypeSig type, ElementType etype) {
			type = type.RemoveModifiers();
			// Assume it's an enum if it's a ValueType
			return type != null && (etype == type.ElementType || type.ElementType == ElementType.ValueType);
		}
Beispiel #46
0
 public string ToString(TypeSig type, TypePrinterFlags flags)
 {
     return(Write(new StringBuilderTypeOutput(), type, flags).ToString());
 }
		/// <summary>
		/// Gets the enum's underlying type
		/// </summary>
		/// <param name="type">An enum type</param>
		/// <returns>The underlying type or <c>null</c> if we couldn't resolve the type ref</returns>
		static TypeSig GetEnumUnderlyingType(TypeSig type) {
			var td = GetEnumTypeDef(type);
			if (td == null)
				return null;
			return td.GetEnumUnderlyingType().RemoveModifiers();
		}
Beispiel #48
0
 public string ToString(TypeSig type)
 {
     return(ToString(type, TypePrinterFlags.Default));
 }
		/// <summary>
		/// Converts <paramref name="type"/> to a <see cref="TypeDef"/>, possibly resolving
		/// a <see cref="TypeRef"/>
		/// </summary>
		/// <param name="type">The type</param>
		/// <returns>A <see cref="TypeDef"/> or <c>null</c> if we couldn't resolve the
		/// <see cref="TypeRef"/> or if <paramref name="type"/> is a type spec</returns>
		static TypeDef GetTypeDef(TypeSig type) {
			var tdr = type as TypeDefOrRefSig;
			if (tdr != null) {
				var td = tdr.TypeDef;
				if (td != null)
					return td;

				var tr = tdr.TypeRef;
				if (tr != null)
					return tr.Resolve();
			}

			return null;
		}
Beispiel #50
0
        static ConstantType GetConstantType(TypeSig type, out ITypeDefOrRef enumType)
        {
            enumType = null;
            var t = type.RemovePinnedAndModifiers();

            switch (t.GetElementType())
            {
            case ElementType.Boolean:       return(ConstantType.Boolean);

            case ElementType.Char:          return(ConstantType.Char);

            case ElementType.I1:            return(ConstantType.SByte);

            case ElementType.U1:            return(ConstantType.Byte);

            case ElementType.I2:            return(ConstantType.Int16);

            case ElementType.U2:            return(ConstantType.UInt16);

            case ElementType.I4:            return(ConstantType.Int32);

            case ElementType.U4:            return(ConstantType.UInt32);

            case ElementType.I8:            return(ConstantType.Int64);

            case ElementType.U8:            return(ConstantType.UInt64);

            case ElementType.R4:            return(ConstantType.Single);

            case ElementType.R8:            return(ConstantType.Double);

            case ElementType.String:        return(ConstantType.String);

            case ElementType.Object:        return(ConstantType.Object);

            case ElementType.ValueType:
            case ElementType.Class:
                var tdr = ((ClassOrValueTypeSig)t).TypeDefOrRef;
                if (tdr.IsSystemType())
                {
                    return(ConstantType.Type);
                }
                enumType = tdr;
                return(ConstantType.Enum);

            case ElementType.SZArray:
                var elemType = t.Next.RemovePinnedAndModifiers();
                switch (elemType.GetElementType())
                {
                case ElementType.Boolean:       return(ConstantType.BooleanArray);

                case ElementType.Char:          return(ConstantType.CharArray);

                case ElementType.I1:            return(ConstantType.SByteArray);

                case ElementType.U1:            return(ConstantType.ByteArray);

                case ElementType.I2:            return(ConstantType.Int16Array);

                case ElementType.U2:            return(ConstantType.UInt16Array);

                case ElementType.I4:            return(ConstantType.Int32Array);

                case ElementType.U4:            return(ConstantType.UInt32Array);

                case ElementType.I8:            return(ConstantType.Int64Array);

                case ElementType.U8:            return(ConstantType.UInt64Array);

                case ElementType.R4:            return(ConstantType.SingleArray);

                case ElementType.R8:            return(ConstantType.DoubleArray);

                case ElementType.String:        return(ConstantType.StringArray);

                case ElementType.Object:        return(ConstantType.ObjectArray);

                case ElementType.ValueType:
                case ElementType.Class:
                    tdr = ((ClassOrValueTypeSig)elemType).TypeDefOrRef;
                    if (tdr.IsSystemType())
                    {
                        return(ConstantType.TypeArray);
                    }
                    enumType = tdr;
                    return(ConstantType.EnumArray);
                }
                break;
            }

            Debug.Fail(string.Format("Unsupported CA named type: {0}", type));
            return(ConstantType.Object);
        }
		static bool CheckCorLibType(TypeSig ts, string name) {
			var tdrs = ts as TypeDefOrRefSig;
			if (tdrs == null)
				return false;
			return CheckCorLibType(tdrs.TypeDefOrRef, name);
		}
Beispiel #52
0
 /// <summary>
 /// Indicates whether the given <see cref="TypeSig" /> belongs to given module
 /// </summary>
 /// <param name="typeSig">The type sig.</param>
 /// <param name="module">The module.</param>
 /// <returns></returns>
 public static bool BelongsTo(this TypeSig typeSig, ModuleDefMD2 module) => BelongsTo(typeSig.Scope as AssemblyRef, module);