コード例 #1
0
        private void EmitWriteArrayLoop(CompilerContext ctx, Local i, Local arr)
        {
            ctx.LoadValue(0);
            ctx.StoreValue(i);
            CodeLabel label  = ctx.DefineLabel();
            CodeLabel label2 = ctx.DefineLabel();

            ctx.Branch(label, false);
            ctx.MarkLabel(label2);
            ctx.LoadArrayValue(arr, i);
            if (this.SupportNull)
            {
                base.Tail.EmitWrite(ctx, null);
            }
            else
            {
                ctx.WriteNullCheckedTail(this.itemType, base.Tail, null);
            }
            ctx.LoadValue(i);
            ctx.LoadValue(1);
            ctx.Add();
            ctx.StoreValue(i);
            ctx.MarkLabel(label);
            ctx.LoadValue(i);
            ctx.LoadLength(arr, false);
            ctx.BranchIfLess(label2, false);
        }
コード例 #2
0
 protected override void EmitRead(CompilerContext ctx, Local valueFrom)
 {
     using (Local localWithValue = ctx.GetLocalWithValue(this.expectedType, valueFrom))
     {
         using (Local local = new Local(ctx, ctx.MapType(typeof(SubItemToken))))
         {
             using (Local local1 = new Local(ctx, ctx.MapType(typeof(int))))
             {
                 ctx.LoadReaderWriter();
                 ctx.EmitCall(ctx.MapType(typeof(ProtoReader)).GetMethod("StartSubItem"));
                 ctx.StoreValue(local);
                 CodeLabel codeLabel  = ctx.DefineLabel();
                 CodeLabel codeLabel1 = ctx.DefineLabel();
                 CodeLabel codeLabel2 = ctx.DefineLabel();
                 ctx.MarkLabel(codeLabel);
                 ctx.EmitBasicRead("ReadFieldHeader", ctx.MapType(typeof(int)));
                 ctx.CopyValue();
                 ctx.StoreValue(local1);
                 ctx.LoadValue(1);
                 ctx.BranchIfEqual(codeLabel1, true);
                 ctx.LoadValue(local1);
                 ctx.LoadValue(1);
                 ctx.BranchIfLess(codeLabel2, false);
                 ctx.LoadReaderWriter();
                 ctx.EmitCall(ctx.MapType(typeof(ProtoReader)).GetMethod("SkipField"));
                 ctx.Branch(codeLabel, true);
                 ctx.MarkLabel(codeLabel1);
                 if (this.Tail.RequiresOldValue)
                 {
                     if (!this.expectedType.IsValueType)
                     {
                         ctx.LoadValue(localWithValue);
                     }
                     else
                     {
                         ctx.LoadAddress(localWithValue, this.expectedType);
                         ctx.EmitCall(this.expectedType.GetMethod("GetValueOrDefault", Helpers.EmptyTypes));
                     }
                 }
                 this.Tail.EmitRead(ctx, null);
                 if (this.expectedType.IsValueType)
                 {
                     Type   type         = this.expectedType;
                     Type[] expectedType = new Type[] { this.Tail.ExpectedType };
                     ctx.EmitCtor(type, expectedType);
                 }
                 ctx.StoreValue(localWithValue);
                 ctx.Branch(codeLabel, false);
                 ctx.MarkLabel(codeLabel2);
                 ctx.LoadValue(local);
                 ctx.LoadReaderWriter();
                 ctx.EmitCall(ctx.MapType(typeof(ProtoReader)).GetMethod("EndSubItem"));
                 ctx.LoadValue(localWithValue);
             }
         }
     }
 }