示例#1
0
        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());
        }
示例#2
0
 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));
        }
示例#4
0
 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]));
 }