void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
 {
     Type type = ExpectedType;
     if (type.IsValueType)
     {
         ctx.EmitCall(GetCustomToString(type));
     }
     else {
         ctx.EmitCall(typeof(object).GetMethod("ToString"));
     }
     ctx.EmitBasicWrite("WriteString", valueFrom);
 }
 void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
 {
     TypeCode typeCode = GetTypeCode();
     if (map == null)
     {
         ctx.LoadValue(valueFrom);
         ctx.ConvertToInt32(typeCode);
         ctx.EmitBasicWrite("WriteInt32", null);
     }
     else
     {
         using (Compiler.Local loc = ctx.GetLocalWithValue(ExpectedType, valueFrom))
         {
             Compiler.CodeLabel @continue = ctx.DefineLabel();
             for (int i = 0; i < map.Length; i++)
             {
                 Compiler.CodeLabel tryNextValue = ctx.DefineLabel(), processThisValue = ctx.DefineLabel();
                 ctx.LoadValue(loc);
                 WriteEnumValue(ctx, typeCode, map[i].Value);
                 ctx.BranchIfEqual(processThisValue, true);
                 ctx.Branch(tryNextValue, true);
                 ctx.MarkLabel(processThisValue);
                 ctx.LoadValue(map[i].WireValue);
                 ctx.EmitBasicWrite("WriteInt32", null);
                 ctx.Branch(@continue, false);
                 ctx.MarkLabel(tryNextValue);
             }
             ctx.LoadReaderWriter();
             ctx.LoadValue(loc);
             ctx.CastToObject(ExpectedType);
             ctx.EmitCall(typeof(ProtoWriter).GetMethod("ThrowEnumException"));
             ctx.MarkLabel(@continue);
         }
     }
     
 }
예제 #3
0
 void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
 {
     ctx.EmitBasicWrite("WriteBytes", valueFrom);
 }
예제 #4
0
 void IProtoSerializer.EmitWrite(Compiler.CompilerContext ctx, Compiler.Local valueFrom)
 {
     Type type = ExpectedType;
     if (Helpers.IsValueType(type))
     {   // note that for structs, we've already asserted that a custom ToString
         // exists; no need to handle the box/callvirt scenario
         
         // force it to a variable if needed, so we can take the address
         using (Compiler.Local loc = ctx.GetLocalWithValue(type, valueFrom))
         {
             ctx.LoadAddress(loc, type);
             ctx.EmitCall(GetCustomToString(type));
         }
     }
     else {
         ctx.EmitCall(ctx.MapType(typeof(object)).GetMethod("ToString"));
     }
     ctx.EmitBasicWrite("WriteString", valueFrom);
 }