예제 #1
0
 private void EmitLoadToStack(ILGenerator generator)
 {
     generator.EmitLdarg(_delegateParameterIndex);
     if (_delegateParameter.ParameterType.IsByRef)
     {
         generator.EmitLdind(_delegateParameter.ParameterType.RemoveByRef());
     }
 }
예제 #2
0
 public override void EmitLoad(ILGenerator generator)
 {
     if (_needLocalVariable)
     {
         generator.EmitLdloca(_localVariable.LocalIndex);
     }
     else
     {
         generator.EmitLdarg(_delegateParameterIndex);
     }
 }
예제 #3
0
 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);
 }
예제 #4
0
        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);
        }