private void EmitLoadToStack(ILGenerator generator) { generator.EmitLdarg(_delegateParameterIndex); if (_delegateParameter.ParameterType.IsByRef) { generator.EmitLdind(_delegateParameter.ParameterType.RemoveByRef()); } }
public override void EmitLoad(ILGenerator generator) { if (_needLocalVariable) { generator.EmitLdloca(_localVariable.LocalIndex); } else { generator.EmitLdarg(_delegateParameterIndex); } }
public override void EmitFinish(ILGenerator generator) { if (!_needLocalVariable) return; generator.EmitLdarg(_delegateParameterIndex); generator.EmitLdloc(_localVariable.LocalIndex); var mt = _methodParameter.ParameterType.RemoveByRef(); var dt = _delegateParameter.ParameterType.RemoveByRef(); if (mt.IsValueType && !dt.IsValueType) generator.EmitBox(mt); generator.EmitStind(dt); }
public override void EmitPrepare(ILGenerator generator) { base.EmitPrepare(generator); if (!_needLocalVariable) return; generator.EmitLdarg(_delegateParameterIndex); var dt = _delegateParameter.ParameterType.RemoveByRef(); var mt = _methodParameter.ParameterType.RemoveByRef(); if (_delegateParameter.ParameterType.IsByRef) generator.EmitLdind(dt); if (dt.IsValueType && !mt.IsValueType) generator.EmitBox(dt); else if (!mt.IsAssignableFrom(dt)) generator.EmitUnBoxAnyOrCastClass(mt); generator.EmitStloc(_localVariable.LocalIndex); }