Tuple<bool, Action<IInternalObjectDBTransaction, DBObjectMetadata, AbstractBufferedReader, IList<ulong>, IList<ulong>>> CreateFreeContent(uint version)
{
EnsureClientTypeVersion();
var method = ILBuilder.Instance.NewMethod<Action<IInternalObjectDBTransaction, DBObjectMetadata,
AbstractBufferedReader, IList<ulong>, IList<ulong>>>($"FreeContent_{Name}_{version}");
var ilGenerator = method.Generator;
var tableVersionInfo = _tableVersions.GetOrAdd(version, version1 => _tableInfoResolver.LoadTableVersionInfo(_id, version1, Name));
var needsFreeContent = false;
var anyNeedsCtx = tableVersionInfo.NeedsCtx();
if (anyNeedsCtx)
{
ilGenerator.DeclareLocal(typeof(IReaderCtx));
ilGenerator
.Ldarg(0)
.Ldarg(2)
.Ldarg(3)
.Ldarg(4)
.Newobj(() => new DBReaderWithFreeInfoCtx(null, null, null, null))
.Stloc(0);
}
for (int fi = 0; fi < tableVersionInfo.FieldCount; fi++)
{
var srcFieldInfo = tableVersionInfo[fi];
Action<IILGen> readerOrCtx;
if (srcFieldInfo.Handler.NeedsCtx())
readerOrCtx = il => il.Ldloc(0);
else
readerOrCtx = il => il.Ldarg(2);
var needsFree = srcFieldInfo.Handler.FreeContent(ilGenerator, readerOrCtx);
needsFreeContent |= needsFree;
}
ilGenerator.Ret();
return Tuple.Create(needsFreeContent, method.Create());
}