private Cci.MemoryStream SerializeRecord(byte kind, Action<Cci.BinaryWriter> data) { Cci.MemoryStream customMetadata = new Cci.MemoryStream(); Cci.BinaryWriter cmw = new Cci.BinaryWriter(customMetadata); cmw.WriteByte(Cci.CustomDebugInfoConstants.CdiVersion); cmw.WriteByte(kind); cmw.Align(4); // length (will be patched) uint lengthPosition = cmw.BaseStream.Position; cmw.WriteUint(0); data(cmw); uint length = customMetadata.Position; cmw.BaseStream.Position = lengthPosition; cmw.WriteUint(length); cmw.BaseStream.Position = length; return customMetadata; }
public void EditAndContinueLambdaAndClosureMap_NoLambdas() { // should not happen in practice, but EditAndContinueMethodDebugInformation should handle it just fine var slots = ImmutableArray<LocalSlotDebugInfo>.Empty; var closures = ImmutableArray<ClosureDebugInfo>.Empty; var lambdas = ImmutableArray<LambdaDebugInfo>.Empty; var customMetadata = new Cci.MemoryStream(); var cmw = new Cci.BinaryWriter(customMetadata); new EditAndContinueMethodDebugInformation(10, slots, closures, lambdas).SerializeLambdaMap(cmw); var bytes = customMetadata.ToImmutableArray(); AssertEx.Equal(new byte[] { 0x0B, 0x01, 0x00 }, bytes); var deserialized = EditAndContinueMethodDebugInformation.Create(default(ImmutableArray<byte>), bytes); AssertEx.Equal(closures, deserialized.Closures); AssertEx.Equal(lambdas, deserialized.Lambdas); }
public void EditAndContinueLambdaAndClosureMap_NoClosures() { var slots = ImmutableArray<LocalSlotDebugInfo>.Empty; var closures = ImmutableArray<ClosureDebugInfo>.Empty; var lambdas = ImmutableArray.Create(new LambdaDebugInfo(20, LambdaDebugInfo.StaticClosureOrdinal, 0)); var customMetadata = new Cci.MemoryStream(); var cmw = new Cci.BinaryWriter(customMetadata); new EditAndContinueMethodDebugInformation(-1, slots, closures, lambdas).SerializeLambdaMap(cmw); var bytes = customMetadata.ToImmutableArray(); AssertEx.Equal(new byte[] { 0x00, 0x01, 0x00, 0x15, 0x01 }, bytes); var deserialized = EditAndContinueMethodDebugInformation.Create(default(ImmutableArray<byte>), bytes); AssertEx.Equal(closures, deserialized.Closures); AssertEx.Equal(lambdas, deserialized.Lambdas); }
public void EditAndContinueLambdaAndClosureMap_NegativeSyntaxOffsets() { var slots = ImmutableArray<LocalSlotDebugInfo>.Empty; var closures = ImmutableArray.Create( new ClosureDebugInfo(-100, 0), new ClosureDebugInfo(10, 0), new ClosureDebugInfo(-200, 0)); var lambdas = ImmutableArray.Create( new LambdaDebugInfo(20, 1, 0), new LambdaDebugInfo(-50, 0, 0), new LambdaDebugInfo(-180, LambdaDebugInfo.StaticClosureOrdinal, 0)); var customMetadata = new Cci.MemoryStream(); var cmw = new Cci.BinaryWriter(customMetadata); new EditAndContinueMethodDebugInformation(0x7b, slots, closures, lambdas).SerializeLambdaMap(cmw); var bytes = customMetadata.ToImmutableArray(); AssertEx.Equal(new byte[] { 0x7C, 0x80, 0xC8, 0x03, 0x64, 0x80, 0xD2, 0x00, 0x80, 0xDC, 0x03, 0x80, 0x96, 0x02, 0x14, 0x01 }, bytes); var deserialized = EditAndContinueMethodDebugInformation.Create(default(ImmutableArray<byte>), bytes); AssertEx.Equal(closures, deserialized.Closures); AssertEx.Equal(lambdas, deserialized.Lambdas); }
public void EditAndContinueLocalSlotMap_NegativeSyntaxOffsets() { var slots = ImmutableArray.Create( new LocalSlotDebugInfo(SynthesizedLocalKind.UserDefined, new LocalDebugId(-1, 10)), new LocalSlotDebugInfo(SynthesizedLocalKind.TryAwaitPendingCaughtException, new LocalDebugId(-20000, 10))); var closures = ImmutableArray<ClosureDebugInfo>.Empty; var lambdas = ImmutableArray<LambdaDebugInfo>.Empty; var customMetadata = new Cci.MemoryStream(); var cmw = new Cci.BinaryWriter(customMetadata); new EditAndContinueMethodDebugInformation(123, slots, closures, lambdas).SerializeLocalSlots(cmw); var bytes = customMetadata.ToImmutableArray(); AssertEx.Equal(new byte[] { 0xFF, 0xC0, 0x00, 0x4E, 0x20, 0x81, 0xC0, 0x00, 0x4E, 0x1F, 0x0A, 0x9A, 0x00, 0x0A }, bytes); var deserialized = EditAndContinueMethodDebugInformation.Create(bytes, default(ImmutableArray<byte>)).LocalSlots; AssertEx.Equal(slots, deserialized); }
/// <summary> /// Produces a serialized blob of all constant initializers. /// Nonconstat initializers are matched with a zero of corresponding size. /// </summary> private ImmutableArray<byte> GetRawData(ImmutableArray<BoundExpression> initializers) { // the initial size is a guess. // there is no point to be precise here as MemoryStream always has N + 1 storage // and will need to be trimmed regardless var stream = new Cci.MemoryStream((uint)(initializers.Length * 4)); var writer = new Cci.BinaryWriter(stream); SerializeArrayRecursive(writer, initializers); return ImmutableArray.Create(stream.Buffer, 0, (int)stream.Position); }