BTDB.EventStoreLayer.ListTypeDescriptor.GenerateSave C# (CSharp) Метод

GenerateSave() публичный Метод

public GenerateSave ( IILGen ilGenerator, Action pushWriter, Action pushCtx, Action pushValue, Type valueType ) : void
ilGenerator IILGen
pushWriter Action
pushCtx Action
pushValue Action
valueType System.Type
Результат void
        public void GenerateSave(IILGen ilGenerator, Action<IILGen> pushWriter, Action<IILGen> pushCtx, Action<IILGen> pushValue, Type valueType)
        {
            var finish = ilGenerator.DefineLabel();
            var next = ilGenerator.DefineLabel();
            var notnull = ilGenerator.DefineLabel();
            var itemType = GetItemType(valueType);
            var localList = ilGenerator.DeclareLocal(
                typeof(IList<>).MakeGenericType(itemType));
            var localIndex = ilGenerator.DeclareLocal(typeof(int));
            var localCount = ilGenerator.DeclareLocal(typeof(int));
            ilGenerator
                .Do(pushValue)
                .Castclass(localList.LocalType)
                .Stloc(localList)
                .Ldloc(localList)
                .BrtrueS(notnull)
                .Do(pushWriter)
                .Callvirt(() => default(AbstractBufferedWriter).WriteByteZero())
                .Br(finish)
                .Mark(notnull)
                .Ldloc(localList)
                .Callvirt(localList.LocalType.GetInterface("ICollection`1").GetProperty("Count").GetGetMethod())
                .Stloc(localCount)
                .Do(pushWriter)
                .Ldloc(localCount)
                .LdcI4(1)
                .Add()
                .Callvirt(() => default(AbstractBufferedWriter).WriteVUInt32(0))
                .LdcI4(0)
                .Stloc(localIndex)
                .Mark(next)
                .Ldloc(localIndex)
                .Ldloc(localCount)
                .BgeUn(finish);
            _itemDescriptor.GenerateSaveEx(ilGenerator, pushWriter, pushCtx,
                il => il.Ldloc(localList)
                        .Ldloc(localIndex)
                        .Callvirt(localList.LocalType.GetMethod("get_Item")), itemType);
            ilGenerator
                .Ldloc(localIndex)
                .LdcI4(1)
                .Add()
                .Stloc(localIndex)
                .Br(next)
                .Mark(finish);
        }