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); }
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; }
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(); } }
/// <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); }