private Cut WriteUnwrapperBody(Cut il, ParameterDefinition argsParam, MethodDefinition original) { var refList = new List <Tuple <int, VariableDefinition> >(); var originalRef = CreateRef(original, il.Method); il = il.ThisOrStatic().Call(originalRef, c => { for (int i = 0; i < original.Parameters.Count; i++) { var p = original.Parameters[i]; if (p.ParameterType.IsByReference) { var elementType = ((ByReferenceType)p.ParameterType).ElementType; var tempVar = new VariableDefinition(elementType); refList.Add(new Tuple <int, VariableDefinition>(i, tempVar)); c.Method.Body.Variables.Add(tempVar); c = c .Store(tempVar, v => v .Load(argsParam) .GetByIndex(StandardTypes.Object, i) .Cast(StandardTypes.Object, elementType)) .LoadRef(tempVar); } else { c = c .Load(argsParam) .GetByIndex(StandardTypes.Object, i) .Cast(StandardTypes.Object, p.ParameterType); } } return(c); }); foreach (var refPar in refList) { il = il.Load(argsParam).SetByIndex(StandardTypes.Object, refPar.Item1, val => val.Load(refPar.Item2).Cast(refPar.Item2.VariableType, StandardTypes.Object)); } if (original.ReturnType.Match(StandardTypes.Void)) { il = il.Value(null); } else { il = il.Cast(originalRef.ReturnType, il.Method.ReturnType); } return(il.Return()); }
protected override Cut LoadReturnValueArgument(Cut pc, AdviceArgument parameter) { if (_retvar == null) { return(pc.Null()); } else { return(pc.Load(_retvar).Cast(_retvar.VariableType, StandardTypes.Object)); } }
public static Cut LoadAspect(this Cut cut, AspectDefinition aspect, MethodDefinition method, PointCut accessor) { FieldReference aspectField; if (method.IsStatic || aspect.Scope == Scope.Global) { aspectField = GetGlobalAspectField(aspect); } else { aspectField = GetInstanceAspectField(aspect, method.DeclaringType, cut); cut = cut.Here(accessor); } return(cut.Load(aspectField)); }
protected override Cut LoadArgumentsArgument(Cut pc, AdviceArgument parameter) { return(pc.Load(_wrapper.Parameters[0])); }
protected override Cut LoadReturnValueArgument(Cut pc, AdviceArgument parameter) { return(pc.Load(pc.Method.Parameters[0])); }