Esempio n. 1
0
        MemorizedPositionWithLength SkipWithMemorizing(int activeBuffer, IILGen ilGenerator, Action <IILGen> pushReader, IFieldHandler handler, IILLocal tempPosition)
        {
            var memoPos  = ilGenerator.DeclareLocal(typeof(IMemorizedPosition));
            var memoLen  = ilGenerator.DeclareLocal(typeof(int));
            var position = new MemorizedPositionWithLength {
                BufferIndex = activeBuffer, Pos = memoPos, Length = memoLen
            };

            MemorizeCurrentPosition(ilGenerator, pushReader, memoPos);
            StoreCurrentPosition(ilGenerator, pushReader, tempPosition);
            handler.Skip(ilGenerator, pushReader);
            ilGenerator
            .Do(pushReader)                                                //[VR]
            .Callvirt(() => default(ByteArrayReader).GetCurrentPosition()) //[posNew];
            .Ldloc(tempPosition)                                           //[posNew, posOld]
            .Sub()                                                         //[readLen]
            .ConvI4()                                                      //[readLen(i)]
            .Stloc(memoLen);                                               //[]
            return(position);
        }
Esempio n. 2
0
 void CopyFromMemorizedPosition(IILGen ilGenerator, Action <IILGen> pushReader, Action <IILGen> pushWriter, MemorizedPositionWithLength memo,
                                IILLocal memoPositionLoc)
 {
     MemorizeCurrentPosition(ilGenerator, pushReader, memoPositionLoc);
     ilGenerator
     .Do(pushWriter)                                                      //[W]
     .Do(pushReader)                                                      //[W,VR]
     .Ldloc(memo.Length)                                                  //[W, VR, readLen]
     .Ldloc(memo.Pos)                                                     //[W, VR, readLen, Memorize]
     .Callvirt(() => default(IMemorizedPosition).Restore())               //[W, VR]
     .Call(() => default(ByteArrayReader).ReadByteArrayRaw(0))            //[W, byte[]]
     .Call(() => default(AbstractBufferedWriter).WriteByteArrayRaw(null)) //[]
     .Ldloc(memoPositionLoc)                                              //[Memorize]
     .Callvirt(() => default(IMemorizedPosition).Restore());              //[]
 }