Esempio n. 1
0
        private List <Instruction> CreateTraceReturnWithExceptionLoggingInstructions(VariableDefinition exceptionValue)
        {
            var instructions = new List <Instruction>();

            VariableDefinition paramNamesDef  = null;
            VariableDefinition paramValuesDef = null;

            paramNamesDef  = MoveNextParamNamesVariable;
            paramValuesDef = MoveNextParamValuesVariable;

            instructions.AddRange(InitArray(paramNamesDef, 1, _typeReferenceProvider.String));
            instructions.AddRange(InitArray(paramValuesDef, 1, _typeReferenceProvider.Object));

            instructions.AddRange(StoreValueReadByInstructionsInArray(paramNamesDef, 0, Instruction.Create(OpCodes.Ldstr, ExceptionMarker)));
            instructions.AddRange(StoreVariableInObjectArray(paramValuesDef, 0, exceptionValue));

            //build up Trace call
            instructions.Add(Instruction.Create(OpCodes.Ldsfld, TypeWeaver.CreateLoggerStaticField(_typeReferenceProvider, _methodReferenceProvider, _generatedType)));
            instructions.AddRange(LoadMethodNameOnStack());

            //start ticks
            instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
            instructions.Add(Instruction.Create(OpCodes.Ldfld, _tickFieldRef));
            //end ticks
            instructions.Add(Instruction.Create(OpCodes.Call, _methodReferenceProvider.GetTimestampReference()));

            instructions.Add(Instruction.Create(OpCodes.Ldloc, paramNamesDef));
            instructions.Add(Instruction.Create(OpCodes.Ldloc, paramValuesDef));
            instructions.Add(Instruction.Create(OpCodes.Callvirt, _methodReferenceProvider.GetTraceLeaveReference()));

            return(instructions);
        }
Esempio n. 2
0
        private void InternalExecute()
        {
            TypeReferenceProvider   typeReferenceProvider   = new TypeReferenceProvider(_configuration, this, _moduleDefinition);
            MethodReferenceProvider methodReferenceProvider = new MethodReferenceProvider(typeReferenceProvider, _moduleDefinition);

            TypeWeaverFactory factory = new TypeWeaverFactory(_configuration.Filter, typeReferenceProvider, methodReferenceProvider, _configuration.ShouldTraceConstructors,
                                                              _configuration.ShouldTraceProperties);

            foreach (TypeDefinition type in _moduleDefinition.GetAllTypes())
            {
                TypeWeaver weaver = factory.Create(type);
                weaver.Execute();
            }
        }
Esempio n. 3
0
        private List <Instruction> CreateTraceReturnLoggingInstructions(VariableDefinition returnValueDef, VariableDefinition configParamDef, Dictionary <string, string> configParameters)
        {
            var instructions = new List <Instruction>();

            VariableDefinition paramNamesDef  = null;
            VariableDefinition paramValuesDef = null;

            bool hasReturnValue = HasReturnValue;

            if (hasReturnValue)
            {
                //Get local variables for the arrays or declare them if they not exist
                paramNamesDef  = MoveNextParamNamesVariable;
                paramValuesDef = MoveNextParamValuesVariable;

                //init arrays
                instructions.AddRange(InitArray(paramNamesDef, 1, _typeReferenceProvider.String));
                instructions.AddRange(InitArray(paramValuesDef, 1, _typeReferenceProvider.Object));

                instructions.AddRange(StoreValueReadByInstructionsInArray(paramNamesDef, 0, Instruction.Create(OpCodes.Ldnull)));
                instructions.AddRange(StoreVariableInObjectArray(paramValuesDef, 0, returnValueDef));
            }

            if (configParameters?.Any() == true)
            {
                instructions.AddRange(LoadConfigParameters(configParamDef, configParameters));
            }

            //build up Trace call
            instructions.Add(Instruction.Create(OpCodes.Ldsfld, TypeWeaver.CreateLoggerStaticField(_typeReferenceProvider, _methodReferenceProvider, _generatedType)));
            instructions.AddRange(LoadMethodNameOnStack());
            instructions.Add(configParameters?.Any() == true ? Instruction.Create(OpCodes.Ldloc, configParamDef) : Instruction.Create(OpCodes.Ldnull));

            //start ticks
            instructions.Add(Instruction.Create(OpCodes.Ldarg_0));
            instructions.Add(Instruction.Create(OpCodes.Ldfld, _tickFieldRef));
            //end ticks
            instructions.Add(Instruction.Create(OpCodes.Call, _methodReferenceProvider.GetTimestampReference()));

            instructions.Add(hasReturnValue ? Instruction.Create(OpCodes.Ldloc, paramNamesDef) : Instruction.Create(OpCodes.Ldnull));
            instructions.Add(hasReturnValue ? Instruction.Create(OpCodes.Ldloc, paramValuesDef) : Instruction.Create(OpCodes.Ldnull));
            instructions.Add(Instruction.Create(OpCodes.Callvirt, _methodReferenceProvider.GetTraceLeaveReference()));

            return(instructions);
        }
Esempio n. 4
0
        private void ChangeStaticLogCallWithoutParameter(Instruction oldInstruction)
        {
            var instructions = new List <Instruction>();

            var methodReference     = (MethodReference)oldInstruction.Operand;
            var methodReferenceInfo = new MethodReferenceInfo(methodReference);

            instructions.Add(Instruction.Create(OpCodes.Ldsfld, TypeWeaver.CreateLoggerStaticField(_typeReferenceProvider, _methodReferenceProvider, _generatedType)));

            if (!methodReferenceInfo.IsPropertyAccessor())
            {
                instructions.AddRange(LoadMethodNameOnStack());
            }

            instructions.Add(Instruction.Create(OpCodes.Callvirt, _methodReferenceProvider.GetInstanceLogMethod(methodReferenceInfo)));

            _moveNextBody.Replace(oldInstruction, instructions);
        }
Esempio n. 5
0
        private void WeaveTraceEnterToStateMachine(Dictionary <string, string> configParameters)
        {
            _moveNextDefinition =
                _generatedType.Methods.Single(it => it.Name.Equals("MoveNext", StringComparison.OrdinalIgnoreCase));
            _moveNextBody = _moveNextDefinition.Body;

            _moveNextBody.SimplifyMacros();

            var processor        = _moveNextBody.GetILProcessor();
            var firstInstruction = _moveNextBody.Instructions.First();

            var stateField = _generatedType.Fields.First(fld =>
                                                         fld.Name.Contains("__state") && fld.FieldType == _typeReferenceProvider.Int);

            var stateFieldRef = stateField.FixFieldReferenceIfDeclaringTypeIsGeneric();

            var loggingTraceEnterInstructions = new List <Instruction>();

            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldarg_0));
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldfld, stateFieldRef));
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldc_I4_M1));
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Bne_Un, firstInstruction));

            if (configParameters?.Any() == true)
            {
                loggingTraceEnterInstructions.AddRange(LoadConfigParameters(ConfigParamDef, configParameters));
            }

            //call the logger with params
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldsfld, TypeWeaver.CreateLoggerStaticField(_typeReferenceProvider, _methodReferenceProvider, _generatedType)));
            loggingTraceEnterInstructions.AddRange(LoadMethodNameOnStack());
            loggingTraceEnterInstructions.Add(configParameters?.Any() == true ? Instruction.Create(OpCodes.Ldloc, ConfigParamDef) : Instruction.Create(OpCodes.Ldnull));

            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldarg_0));
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldfld, _paramNamesFieldRef.FixFieldReferenceIfDeclaringTypeIsGeneric()));

            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldarg_0));
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Ldfld, _paramValuesFieldRef.FixFieldReferenceIfDeclaringTypeIsGeneric()));
            loggingTraceEnterInstructions.Add(Instruction.Create(OpCodes.Callvirt, _methodReferenceProvider.GetTraceEnterReference()));

            firstInstruction.InsertBefore(processor, loggingTraceEnterInstructions);
        }
Esempio n. 6
0
        private void ChangeStaticLogCallWithParameter(Instruction oldInstruction)
        {
            var instructions        = new List <Instruction>();
            var methodReference     = (MethodReference)oldInstruction.Operand;
            var methodReferenceInfo = new MethodReferenceInfo(methodReference);

            if (methodReferenceInfo.IsPropertyAccessor() && methodReferenceInfo.IsSetter)
            {
                throw new Exception("Rewriting static property setters is not supported.");
            }

            var parameters = methodReference.Parameters;

            //create variables to store parameters and push values into them
            var variables = new VariableDefinition[parameters.Count];

            for (int idx = 0; idx < parameters.Count; idx++)
            {
                variables[idx] = GetVariableDefinitionForType(parameters[idx].ParameterType, methodReference, _moveNextDefinition);
                _moveNextBody.Variables.Add(variables[idx]);
            }

            //store in reverse order
            for (int idx = parameters.Count - 1; idx >= 0; idx--)
            {
                instructions.Add(Instruction.Create(OpCodes.Stloc, variables[idx]));
            }

            //build-up instance call
            instructions.Add(Instruction.Create(OpCodes.Ldsfld, TypeWeaver.CreateLoggerStaticField(_typeReferenceProvider, _methodReferenceProvider, _generatedType)));
            instructions.AddRange(LoadMethodNameOnStack());

            for (int idx = 0; idx < parameters.Count; idx++)
            {
                instructions.Add(Instruction.Create(OpCodes.Ldloc, variables[idx]));
            }

            instructions.Add(Instruction.Create(OpCodes.Callvirt, _methodReferenceProvider.GetInstanceLogMethod(methodReferenceInfo, parameters)));

            _moveNextBody.Replace(oldInstruction, instructions);
        }