void ProtoBuf.Serializers.IProtoSerializer.EmitWrite(CompilerContext ctx, Local valueFrom) { ProtoTypeCode typeCode = this.GetTypeCode(); if (this.map == null) { ctx.LoadValue(valueFrom); ctx.ConvertToInt32(typeCode, false); ctx.EmitBasicWrite("WriteInt32", null); return; } using (Local localWithValue = ctx.GetLocalWithValue(this.ExpectedType, valueFrom)) { CodeLabel codeLabel = ctx.DefineLabel(); for (int i = 0; i < (int)this.map.Length; i++) { CodeLabel codeLabel1 = ctx.DefineLabel(); CodeLabel codeLabel2 = ctx.DefineLabel(); ctx.LoadValue(localWithValue); EnumSerializer.WriteEnumValue(ctx, typeCode, this.map[i].RawValue); ctx.BranchIfEqual(codeLabel2, true); ctx.Branch(codeLabel1, true); ctx.MarkLabel(codeLabel2); ctx.LoadValue(this.map[i].WireValue); ctx.EmitBasicWrite("WriteInt32", null); ctx.Branch(codeLabel, false); ctx.MarkLabel(codeLabel1); } ctx.LoadReaderWriter(); ctx.LoadValue(localWithValue); ctx.CastToObject(this.ExpectedType); ctx.EmitCall(ctx.MapType(typeof(ProtoWriter)).GetMethod("ThrowEnumException")); ctx.MarkLabel(codeLabel); } }