Пример #1
0
        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);
            }
        }
Пример #2
0
 public void EmitWrite(CompilerContext ctx, Local valueFrom)
 {
     ctx.LoadValue(valueFrom);
     ctx.CastToObject(this.type);
     ctx.LoadReaderWriter();
     ctx.LoadValue(ctx.MapMetaKeyToCompiledKey(this.key));
     ctx.LoadValue((int)this.options);
     ctx.EmitCall(ctx.MapType(typeof(BclHelpers)).GetMethod("WriteNetObject"));
 }
Пример #3
0
 public override void EmitCreateInstance(CompilerContext ctx)
 {
     using (Compiler.Local builder = new Compiler.Local(ctx, _builderFactory.ReturnType))
     {
         ctx.EmitCall(_builderFactory);
         ctx.LoadAddress(builder, builder.Type);
         ctx.EmitCall(_finish);
         ctx.CopyValue();
         ctx.CastToObject(ExpectedType);
         ctx.EmitCallNoteObject();
     }
 }
Пример #4
0
 void ProtoBuf.Serializers.IProtoSerializer.EmitWrite(CompilerContext ctx, Local valueFrom)
 {
     if (!this.EmitDedicatedMethod(ctx, valueFrom, false))
     {
         ctx.LoadValue(valueFrom);
         if (this.type.IsValueType)
         {
             ctx.CastToObject(this.type);
         }
         ctx.LoadValue(ctx.MapMetaKeyToCompiledKey(this.key));
         ctx.LoadReaderWriter();
         ctx.EmitCall(ctx.MapType(typeof(ProtoWriter)).GetMethod((this.recursionCheck ? "WriteObject" : "WriteRecursionSafeObject")));
     }
 }
Пример #5
0
 void ProtoBuf.Serializers.IProtoSerializer.EmitRead(CompilerContext ctx, Local valueFrom)
 {
     if (!this.EmitDedicatedMethod(ctx, valueFrom, true))
     {
         ctx.LoadValue(valueFrom);
         if (this.type.IsValueType)
         {
             ctx.CastToObject(this.type);
         }
         ctx.LoadValue(ctx.MapMetaKeyToCompiledKey(this.key));
         ctx.LoadReaderWriter();
         ctx.EmitCall(ctx.MapType(typeof(ProtoReader)).GetMethod("ReadObject"));
         ctx.CastFromObject(this.type);
     }
 }
Пример #6
0
 public void EmitRead(CompilerContext ctx, Local valueFrom)
 {
     ctx.LoadValue(valueFrom);
     ctx.CastToObject(this.type);
     ctx.LoadReaderWriter();
     ctx.LoadValue(ctx.MapMetaKeyToCompiledKey(this.key));
     if (this.type != ctx.MapType(typeof(object)))
     {
         ctx.LoadValue(this.type);
     }
     else
     {
         ctx.LoadNullRef();
     }
     ctx.LoadValue((int)this.options);
     ctx.EmitCall(ctx.MapType(typeof(BclHelpers)).GetMethod("ReadNetObject"));
     ctx.CastFromObject(this.type);
 }
Пример #7
0
        private static void EmitReadAndAddItem(CompilerContext ctx, Local list, IProtoSerializer tail, MethodInfo add, bool castListForAdd)
        {
            ctx.LoadAddress(list, list.Type);
            if (castListForAdd)
            {
                ctx.Cast(add.DeclaringType);
            }
            Type expectedType = tail.ExpectedType;
            bool returnsValue = tail.ReturnsValue;

            if (!tail.RequiresOldValue)
            {
                if (!returnsValue)
                {
                    throw new InvalidOperationException();
                }
                tail.EmitRead(ctx, null);
            }
            else if (expectedType.IsValueType || !returnsValue)
            {
                using (Local local = new Local(ctx, expectedType))
                {
                    if (!expectedType.IsValueType)
                    {
                        ctx.LoadNullRef();
                        ctx.StoreValue(local);
                    }
                    else
                    {
                        ctx.LoadAddress(local, expectedType);
                        ctx.EmitCtor(expectedType);
                    }
                    tail.EmitRead(ctx, local);
                    if (!returnsValue)
                    {
                        ctx.LoadValue(local);
                    }
                }
            }
            else
            {
                ctx.LoadNullRef();
                tail.EmitRead(ctx, null);
            }
            Type parameterType = add.GetParameters()[0].ParameterType;

            if (parameterType != expectedType)
            {
                if (parameterType != ctx.MapType(typeof(object)))
                {
                    if (Helpers.GetUnderlyingType(parameterType) != expectedType)
                    {
                        throw new InvalidOperationException("Conflicting item/add type");
                    }
                    Type[] typeArray = new Type[] { expectedType };
                    ctx.EmitCtor(Helpers.GetConstructor(parameterType, typeArray, false));
                }
                else
                {
                    ctx.CastToObject(expectedType);
                }
            }
            ctx.EmitCall(add);
            if (add.ReturnType != ctx.MapType(typeof(void)))
            {
                ctx.DiscardValue();
            }
        }