public void EmitRead(JITContext context) { LocalBuilder top = context.PeekTypeDef(); if (top != null) { context.ReadFieldBlob(); context.PushType(typeof(BlobReader)); } context.CreateType(targetType); context.PushType(targetType); context.PushTypeDef(context.PeekTop(targetType)); Label readField = context.CreateLabel(); Label cleanup = context.CreateLabel(); context.MarkLabel(readField); context.CanReadBytes(BlobReader.FieldHeaderLength); context.GotoWhenFalse(cleanup); context.ReadFieldHeader(); for (int i = 0; i < fields.Length; i++) { Label nextField = context.CreateLabel(); if (fields[i].PeekIntKey != -1) { context.EmitKeyPeekTest(fields[i].PeekIntKey, nextField); } else { context.EmitKeyTest(fields[i].ByteKey, nextField); } fields[i].Serializer.EmitRead(context); context.Goto(readField); context.MarkLabel(nextField); } context.SkipField(); context.Goto(readField); context.MarkLabel(cleanup); context.SkipSpare(); if (top != null) { context.DisposeReaderOnTop(); context.PopType(typeof(BlobReader)); } context.LoadLocal(context.PeekTypeDef()); context.PopTypeDef(); context.PopType(targetType); }