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); }
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); } } } }