Exemple #1
0
        TypeSig ReadFieldOrPropType()
        {
            if (!recursionCounter.Increment())
            {
                throw new CABlobParserException("Too much recursion");
            }
            TypeSig result;

            switch ((SerializationType)reader.ReadByte())
            {
            case SerializationType.Boolean: result = module.CorLibTypes.Boolean; break;

            case SerializationType.Char:    result = module.CorLibTypes.Char; break;

            case SerializationType.I1:              result = module.CorLibTypes.SByte; break;

            case SerializationType.U1:              result = module.CorLibTypes.Byte; break;

            case SerializationType.I2:              result = module.CorLibTypes.Int16; break;

            case SerializationType.U2:              result = module.CorLibTypes.UInt16; break;

            case SerializationType.I4:              result = module.CorLibTypes.Int32; break;

            case SerializationType.U4:              result = module.CorLibTypes.UInt32; break;

            case SerializationType.I8:              result = module.CorLibTypes.Int64; break;

            case SerializationType.U8:              result = module.CorLibTypes.UInt64; break;

            case SerializationType.R4:              result = module.CorLibTypes.Single; break;

            case SerializationType.R8:              result = module.CorLibTypes.Double; break;

            case SerializationType.String:  result = module.CorLibTypes.String; break;

            case SerializationType.SZArray: result = new SZArraySig(ReadFieldOrPropType()); break;

            case SerializationType.Type:    result = new ClassSig(module.CorLibTypes.GetTypeRef("System", "Type")); break;

            case SerializationType.TaggedObject: result = module.CorLibTypes.Object; break;

            case SerializationType.Enum:    result = ReadType(false); break;

            default: throw new CABlobParserException("Invalid type");
            }
            recursionCounter.Decrement();
            return(result);
        }
Exemple #2
0
 TypeSig ReadFieldOrPropType()
 {
     if (!recursionCounter.Increment())
         throw new CABlobParserException("Too much recursion");
     TypeSig result;
     switch ((SerializationType)reader.ReadByte()) {
     case SerializationType.Boolean: result = module.CorLibTypes.Boolean; break;
     case SerializationType.Char:	result = module.CorLibTypes.Char; break;
     case SerializationType.I1:		result = module.CorLibTypes.SByte; break;
     case SerializationType.U1:		result = module.CorLibTypes.Byte; break;
     case SerializationType.I2:		result = module.CorLibTypes.Int16; break;
     case SerializationType.U2:		result = module.CorLibTypes.UInt16; break;
     case SerializationType.I4:		result = module.CorLibTypes.Int32; break;
     case SerializationType.U4:		result = module.CorLibTypes.UInt32; break;
     case SerializationType.I8:		result = module.CorLibTypes.Int64; break;
     case SerializationType.U8:		result = module.CorLibTypes.UInt64; break;
     case SerializationType.R4:		result = module.CorLibTypes.Single; break;
     case SerializationType.R8:		result = module.CorLibTypes.Double; break;
     case SerializationType.String:	result = module.CorLibTypes.String; break;
     case SerializationType.SZArray: result = new SZArraySig(ReadFieldOrPropType()); break;
     case SerializationType.Type:	result = new ClassSig(module.CorLibTypes.GetTypeRef("System", "Type")); break;
     case SerializationType.TaggedObject: result = module.CorLibTypes.Object; break;
     case SerializationType.Enum:	result = ReadType(); break;
     default: throw new CABlobParserException("Invalid type");
     }
     recursionCounter.Decrement();
     return result;
 }
Exemple #3
0
		void OnTypeKindChanged2() {
			switch ((Types.TypeKind)TypeKind.SelectedItem) {
			case Types.TypeKind.Unknown:
				break;

			case Types.TypeKind.Class:
				if (!IsClassBaseType(BaseTypeSig))
					BaseTypeSig = ownerModule.CorLibTypes.Object;
				TypeSemantics.SelectedItem = Types.TypeSemantics.Class;
				break;

			case Types.TypeKind.StaticClass:
				BaseTypeSig = ownerModule.CorLibTypes.Object;
				TypeLayout.SelectedItem = Types.TypeLayout.AutoLayout;
				TypeSemantics.SelectedItem = Types.TypeSemantics.Class;
				Abstract = true;
				Sealed = true;
				break;

			case Types.TypeKind.Interface:
				BaseTypeSig = null;
				TypeLayout.SelectedItem = Types.TypeLayout.AutoLayout;
				TypeSemantics.SelectedItem = Types.TypeSemantics.Interface;
				Abstract = true;
				Sealed = false;
				break;

			case Types.TypeKind.Struct:
				BaseTypeSig = new ClassSig(ownerModule.CorLibTypes.GetTypeRef("System", "ValueType"));
				TypeSemantics.SelectedItem = Types.TypeSemantics.Class;
				Abstract = false;
				Sealed = true;
				break;

			case Types.TypeKind.Enum:
				BaseTypeSig = new ClassSig(ownerModule.CorLibTypes.GetTypeRef("System", "Enum"));
				TypeLayout.SelectedItem = Types.TypeLayout.AutoLayout;
				TypeSemantics.SelectedItem = Types.TypeSemantics.Class;
				Abstract = false;
				Sealed = true;
				break;

			case Types.TypeKind.Delegate:
				BaseTypeSig = new ClassSig(ownerModule.CorLibTypes.GetTypeRef("System", "MulticastDelegate"));
				TypeLayout.SelectedItem = Types.TypeLayout.AutoLayout;
				TypeSemantics.SelectedItem = Types.TypeSemantics.Class;
				Abstract = false;
				Sealed = true;
				break;

			default:
				throw new InvalidOperationException();
			}
		}
Exemple #4
0
        /// <summary>
        /// Reads the next type
        /// </summary>
        /// <returns>A new <see cref="TypeSig"/> instance or <c>null</c> if invalid element type</returns>
        TypeSig ReadType()
        {
            if (!recursionCounter.Increment())
            {
                return(null);
            }

            uint    num;
            TypeSig nextType, result = null;

            switch ((ElementType)reader.ReadByte())
            {
            case ElementType.Void: result = corLibTypes.Void; break;

            case ElementType.Boolean: result = corLibTypes.Boolean; break;

            case ElementType.Char: result = corLibTypes.Char; break;

            case ElementType.I1: result = corLibTypes.SByte; break;

            case ElementType.U1: result = corLibTypes.Byte; break;

            case ElementType.I2: result = corLibTypes.Int16; break;

            case ElementType.U2: result = corLibTypes.UInt16; break;

            case ElementType.I4: result = corLibTypes.Int32; break;

            case ElementType.U4: result = corLibTypes.UInt32; break;

            case ElementType.I8: result = corLibTypes.Int64; break;

            case ElementType.U8: result = corLibTypes.UInt64; break;

            case ElementType.R4: result = corLibTypes.Single; break;

            case ElementType.R8: result = corLibTypes.Double; break;

            case ElementType.String: result = corLibTypes.String; break;

            case ElementType.TypedByRef: result = corLibTypes.TypedReference; break;

            case ElementType.I: result = corLibTypes.IntPtr; break;

            case ElementType.U: result = corLibTypes.UIntPtr; break;

            case ElementType.Object: result = corLibTypes.Object; break;

            case ElementType.Ptr: result = new PtrSig(ReadType()); break;

            case ElementType.ByRef: result = new ByRefSig(ReadType()); break;

            case ElementType.ValueType: result = new ValueTypeSig(ReadTypeDefOrRef()); break;

            case ElementType.Class: result = new ClassSig(ReadTypeDefOrRef()); break;

            case ElementType.FnPtr: result = new FnPtrSig(ReadSig()); break;

            case ElementType.SZArray: result = new SZArraySig(ReadType()); break;

            case ElementType.CModReqd: result = new CModReqdSig(ReadTypeDefOrRef(), ReadType()); break;

            case ElementType.CModOpt: result = new CModOptSig(ReadTypeDefOrRef(), ReadType()); break;

            case ElementType.Sentinel: result = new SentinelSig(); break;

            case ElementType.Pinned: result = new PinnedSig(ReadType()); break;

            case ElementType.Var:
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                result = new GenericVar(num, gpContext.Type);
                break;

            case ElementType.MVar:
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                result = new GenericMVar(num, gpContext.Method);
                break;

            case ElementType.ValueArray:
                nextType = ReadType();
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                result = new ValueArraySig(nextType, num);
                break;

            case ElementType.Module:
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                result = new ModuleSig(num, ReadType());
                break;

            case ElementType.GenericInst:
                nextType = ReadType();
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                var genericInstSig = new GenericInstSig(nextType as ClassOrValueTypeSig, num);
                var args           = genericInstSig.GenericArguments;
                for (uint i = 0; i < num; i++)
                {
                    args.Add(ReadType());
                }
                result = genericInstSig;
                break;

            case ElementType.Array:
                nextType = ReadType();
                uint rank;
                if (!reader.ReadCompressedUInt32(out rank))
                {
                    break;
                }
                if (rank == 0)
                {
                    result = new ArraySig(nextType, rank);
                    break;
                }
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                var sizes = new List <uint>((int)num);
                for (uint i = 0; i < num; i++)
                {
                    uint size;
                    if (!reader.ReadCompressedUInt32(out size))
                    {
                        goto exit;
                    }
                    sizes.Add(size);
                }
                if (!reader.ReadCompressedUInt32(out num))
                {
                    break;
                }
                var lowerBounds = new List <int>((int)num);
                for (uint i = 0; i < num; i++)
                {
                    int size;
                    if (!reader.ReadCompressedInt32(out size))
                    {
                        goto exit;
                    }
                    lowerBounds.Add(size);
                }
                result = new ArraySig(nextType, rank, sizes, lowerBounds);
                break;

            case ElementType.Internal:
                IntPtr address;
                if (IntPtr.Size == 4)
                {
                    address = new IntPtr(reader.ReadInt32());
                }
                else
                {
                    address = new IntPtr(reader.ReadInt64());
                }
                result = helper.ConvertRTInternalAddress(address);
                break;

            case ElementType.End:
            case ElementType.R:
            default:
                result = null;
                break;
            }
exit:
            recursionCounter.Decrement();
            return(result);
        }
		public ClassOrValueTypeSig Type(bool isValueType, string ns, string name, IResolutionScope resolutionScope) {
			var typeRef = module.UpdateRowId(new TypeRefUser(module, ns, name, resolutionScope));
			ClassOrValueTypeSig type;
			if (isValueType)
				type = new ValueTypeSig(typeRef);
			else
				type = new ClassSig(typeRef);
			return (ClassOrValueTypeSig)Add(type);
		}