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); }
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()); //[] }