internal void SerializeLambdaMap(BlobBuilder writer) { Debug.Assert(this.MethodOrdinal >= -1); writer.WriteCompressedInteger(this.MethodOrdinal + 1); int syntaxOffsetBaseline = -1; foreach (ClosureDebugInfo info in this.Closures) { if (info.SyntaxOffset < syntaxOffsetBaseline) { syntaxOffsetBaseline = info.SyntaxOffset; } } foreach (LambdaDebugInfo info in this.Lambdas) { if (info.SyntaxOffset < syntaxOffsetBaseline) { syntaxOffsetBaseline = info.SyntaxOffset; } } writer.WriteCompressedInteger(-syntaxOffsetBaseline); writer.WriteCompressedInteger(this.Closures.Length); foreach (ClosureDebugInfo info in this.Closures) { writer.WriteCompressedInteger(info.SyntaxOffset - syntaxOffsetBaseline); } foreach (LambdaDebugInfo info in this.Lambdas) { Debug.Assert(info.ClosureOrdinal >= LambdaDebugInfo.MinClosureOrdinal); Debug.Assert(info.LambdaId.Generation == 0); writer.WriteCompressedInteger(info.SyntaxOffset - syntaxOffsetBaseline); writer.WriteCompressedInteger(info.ClosureOrdinal - LambdaDebugInfo.MinClosureOrdinal); } }
internal void SerializeLocalSlots(BlobBuilder writer) { int syntaxOffsetBaseline = -1; foreach (LocalSlotDebugInfo localSlot in this.LocalSlots) { if (localSlot.Id.SyntaxOffset < syntaxOffsetBaseline) { syntaxOffsetBaseline = localSlot.Id.SyntaxOffset; } } if (syntaxOffsetBaseline != -1) { writer.WriteByte(SyntaxOffsetBaseline); writer.WriteCompressedInteger(-syntaxOffsetBaseline); } foreach (LocalSlotDebugInfo localSlot in this.LocalSlots) { SynthesizedLocalKind kind = localSlot.SynthesizedKind; Debug.Assert(kind <= SynthesizedLocalKind.MaxValidValueForLocalVariableSerializedToDebugInformation); if (!kind.IsLongLived()) { writer.WriteByte(0); continue; } byte b = (byte)(kind + 1); Debug.Assert((b & (1 << 7)) == 0); bool hasOrdinal = localSlot.Id.Ordinal > 0; if (hasOrdinal) { b |= 1 << 7; } writer.WriteByte(b); writer.WriteCompressedInteger(localSlot.Id.SyntaxOffset - syntaxOffsetBaseline); if (hasOrdinal) { writer.WriteCompressedInteger(localSlot.Id.Ordinal); } } }