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