BTDB.FieldHandler.DictionaryFieldHandler.Load C# (CSharp) Method

Load() public method

public Load ( IILGen ilGenerator, Action pushReaderOrCtx ) : void
ilGenerator IILGen
pushReaderOrCtx Action
return void
        public void Load(IILGen ilGenerator, Action<IILGen> pushReaderOrCtx)
        {
            var localCount = ilGenerator.DeclareLocal(typeof(uint));
            var localResultOfObject = ilGenerator.DeclareLocal(typeof(object));
            var localResult = ilGenerator.DeclareLocal(HandledType());
            var loadSkipped = ilGenerator.DefineLabel();
            var finish = ilGenerator.DefineLabel();
            var readfinish = ilGenerator.DefineLabel();
            var next = ilGenerator.DefineLabel();
            var genericArguments = _type.GetGenericArguments();
            object fake;
            ilGenerator
                .Do(pushReaderOrCtx)
                .Ldloca(localResultOfObject)
                .Callvirt(() => default(IReaderCtx).ReadObject(out fake))
                .Brfalse(loadSkipped)
                .Do(Extensions.PushReaderFromCtx(pushReaderOrCtx))
                .Callvirt(() => default(AbstractBufferedReader).ReadVUInt32())
                .Stloc(localCount)
                .Ldloc(localCount)
                .Newobj(typeof(Dictionary<,>).MakeGenericType(genericArguments).GetConstructor(new[] { typeof(int) }))
                .Stloc(localResult)
                .Do(pushReaderOrCtx)
                .Ldloc(localResult)
                .Castclass(typeof(object))
                .Callvirt(() => default(IReaderCtx).RegisterObject(null))
                .Mark(next)
                .Ldloc(localCount)
                .Brfalse(readfinish)
                .Ldloc(localCount)
                .LdcI4(1)
                .Sub()
                .ConvU4()
                .Stloc(localCount)
                .Ldloc(localResult)
                .GenerateLoad(_keysHandler, genericArguments[0], pushReaderOrCtx, _typeConvertorGenerator)
                .GenerateLoad(_valuesHandler, genericArguments[1], pushReaderOrCtx, _typeConvertorGenerator)
                .Callvirt(_type.GetMethod("Add"))
                .Br(next)
                .Mark(readfinish)
                .Do(pushReaderOrCtx)
                .Callvirt(() => default(IReaderCtx).ReadObjectDone())
                .Br(finish)
                .Mark(loadSkipped)
                .Ldloc(localResultOfObject)
                .Isinst(_type)
                .Stloc(localResult)
                .Mark(finish)
                .Ldloc(localResult);
        }