static void Main(string[] args) { using (var writer = new PublicGen(@"NativeFormatReaderCommonGen.cs")) { writer.EmitSource(); } using (var writer = new ReaderGen(@"NativeFormatReaderGen.cs")) { writer.EmitSource(); } using (var writer = new WriterGen(@"..\..\..\..\..\ILCompiler.MetadataWriter\src\Internal\Metadata\NativeFormat\Writer\NativeFormatWriterGen.cs")) { writer.EmitSource(); } using (var writer = new MdBinaryReaderGen(@"MdBinaryReaderGen.cs")) { writer.EmitSource(); } using (var writer = new MdBinaryWriterGen(@"..\..\..\..\..\ILCompiler.MetadataWriter\src\Internal\Metadata\NativeFormat\Writer\MdBinaryWriterGen.cs")) { writer.EmitSource(); } }
static void Main(string[] args) { using (var writer = new PublicGen(@"NativeFormatReaderCommonGen.cs")) { writer.EmitSource(); } using (var writer = new ReaderGen(@"NativeFormatReaderGen.cs")) { writer.EmitSource(); } using (var writer = new WriterGen(@"..\..\..\..\aot\ILCompiler.MetadataTransform\Internal\Metadata\NativeFormat\Writer\NativeFormatWriterGen.cs")) { writer.EmitSource(); } using (var writer = new MdBinaryReaderGen(@"MdBinaryReaderGen.cs")) { writer.EmitSource(); } using (var writer = new MdBinaryWriterGen(@"..\..\..\..\aot\ILCompiler.MetadataTransform\Internal\Metadata\NativeFormat\Writer\MdBinaryWriterGen.cs")) { writer.EmitSource(); } }
void EmitWrite(SerializerCodeGen g, Label?endLabel, MetaType metaType, Local actualValue, Local actualType, int recursionLevel = 0) { using (g.ctx.StartDebugBlockAuto(this, metaType.GetFinalSettingsCopy().Name + ", level = " + recursionLevel)) { WriterGen dest = g.Writer; var breakLabel = g.DefineLabel(); g.If(metaType.Type != actualType.AsOperand); { foreach (var subType in metaType.GetSubtypes().OrderBy(st => st.FieldNumber)) { MetaType derivedType = subType.DerivedType; if (derivedType.Type == metaType.Type) { continue; } g.If(actualValue.AsOperand.Is(derivedType.Type)); { if (recursionLevel == 0) { g.If(derivedType.Type == actualType.AsOperand); { dest.WriteFieldHeaderComplete(WireType.Variant); dest.WriteInt32(subType.FieldNumber + 1); g.Goto(endLabel ?? breakLabel); } g.End(); using (var token = g.ctx.Local(typeof(SubItemToken))) { g.Assign(token, g.WriterFunc.StartSubItem(null, true)); dest.WriteFieldHeaderIgnored(WireType.Variant); dest.WriteInt32(subType.FieldNumber + 1); EmitWrite(g, null, derivedType, actualValue, actualType, 1); dest.EndSubItem(token); } } else { dest.WriteFieldHeaderIgnored(WireType.Variant); dest.WriteInt32(subType.FieldNumber + 1); EmitWrite(g, null, derivedType, actualValue, actualType, recursionLevel + 1); } g.Goto(endLabel ?? breakLabel); } g.End(); } } g.End(); g.MarkLabel(breakLabel); if (recursionLevel == 0) { dest.WriteFieldHeaderComplete(WireType.Variant); dest.WriteInt32(0); } } }