private void Loop(ILEmitter il, LocalBuilder enumerator, Label loopStart, LocalBuilder hash) { il.DefineLabel(out var loopEnd); using (il.LocalsScope()) { il.MarkLabel(loopStart) .Brtrue_S(CallMethod(_moveNextMethod, LoadCaller(enumerator)), out var next) .Br(loopEnd) .MarkLabel(next); } using (il.LocalsScope()) { var enumerators = new Dictionary <ushort, LocalBuilder>(1) { [Arg.Input] = enumerator }; var itemVariable = new EnumerableItemVariable(_enumeratorType, _elementType, _getCurrentMethod, enumerators); _resolver .GetHasherEmitter(itemVariable) .EmitHashing(il, hash) .Br(loopStart) .MarkLabel(loopEnd); } }
private void Loop(ILEmitter il, LocalBuilder xEnumerator, LocalBuilder yEnumerator, Label exitLoop) { il.DefineLabel(out var loopStart); using (il.LocalsScope()) { il.MarkLabel(loopStart); var(xDone, yDone) = EmitMoveNext(xEnumerator, yEnumerator, il); _emitCheckIfLoopsAreDone(il, xDone, yDone, exitLoop); } using (il.LocalsScope()) { var enumerators = new Dictionary <ushort, LocalBuilder>(2) { [Arg.X] = xEnumerator, [Arg.Y] = yEnumerator }; var itemVariable = new EnumerableItemVariable(_enumeratorType, _elementType, _getCurrentMethod, enumerators); var itemComparison = _resolver.GetComparisonEmitter(itemVariable); il.Emit(itemComparison.Emit(loopStart)) .Emit(itemComparison.EmitCheckForResult(loopStart)); } }