Example #1
0
 public void Execute(NotNullAttribute attribute, PropertyDefinition property, IlProcessorAppender ilProcessor)
 {
     GenerateNullCheck(
         property.SetMethod.Parameters.First(),
         ilProcessor,
         "value"
         );
 }
Example #2
0
        private void GenerateCheck(ParameterDefinition parameter, IlProcessorAppender ilProcessor, string name)
        {
            var endInstruction = Instruction.Create(OpCodes.Nop);

            // Null Check
            var whiteSpaceCheckInitializer = Instruction.Create(OpCodes.Ldc_I4_0);

            ilProcessor.Append(OpCodes.Ldarg, parameter);
            ilProcessor.Append(OpCodes.Brtrue_S, whiteSpaceCheckInitializer);

            ilProcessor.Append(OpCodes.Ldstr, name);
            ilProcessor.Append(OpCodes.Newobj, GetArgumentNullExceptionConstructor());
            ilProcessor.Append(OpCodes.Throw);

            // Whitespace Check
            ilProcessor.Append(whiteSpaceCheckInitializer);
            var counter = ilProcessor.DeclareLocal(ModuleDefinition.TypeSystem.Int32, "<>__" + parameter.Name + "__WhiteSpaceCheckCounter");

            ilProcessor.Append(OpCodes.Stloc, counter);

            var loopCondition = Instruction.Create(OpCodes.Ldloc, counter);

            ilProcessor.Append(OpCodes.Br, loopCondition);

            // Loop body
            var loopBody = ilProcessor.Append(OpCodes.Ldarg, parameter);

            ilProcessor.Append(OpCodes.Ldloc, counter);
            ilProcessor.Append(GetElement(parameter));
            ilProcessor.Append(OpCodes.Call, GetIsWhiteSpace());
            ilProcessor.Append(OpCodes.Brfalse, endInstruction);

            // i++
            ilProcessor.Append(OpCodes.Ldloc, counter);
            ilProcessor.Append(OpCodes.Ldc_I4_1);
            ilProcessor.Append(OpCodes.Add);
            ilProcessor.Append(OpCodes.Stloc, counter);

            // Loop condition
            ilProcessor.Append(loopCondition); // Ldloc counter
            ilProcessor.Append(OpCodes.Ldarg, parameter);
            ilProcessor.Append(OpCodes.Call, GetLength(parameter));
            ilProcessor.Append(OpCodes.Clt);
            ilProcessor.Append(OpCodes.Brtrue, loopBody);

            // Fall through if we got to the end of the string without detecting non-whitespace
            ilProcessor.Append(OpCodes.Ldstr, "The given string cannot be empty or only contain whitespace");
            ilProcessor.Append(OpCodes.Ldstr, name);
            ilProcessor.Append(OpCodes.Newobj, GetArgumentExceptionConstructor());
            ilProcessor.Append(OpCodes.Throw);

            ilProcessor.Append(endInstruction);
        }
Example #3
0
        private void GenerateCheck(ParameterDefinition parameter, IlProcessorAppender ilProcessor, string name)
        {
            var endInstruction = Instruction.Create(OpCodes.Nop);

            // Null Check
            var emptyCheckLdArg = Instruction.Create(OpCodes.Ldarg, parameter);

            ilProcessor.Append(OpCodes.Ldarg, parameter);
            ilProcessor.Append(OpCodes.Brtrue_S, emptyCheckLdArg);

            ilProcessor.Append(OpCodes.Ldstr, name);
            ilProcessor.Append(OpCodes.Newobj, GetArgumentNullExceptionConstructor());
            ilProcessor.Append(OpCodes.Throw);

            // Empty Check
            ilProcessor.Append(emptyCheckLdArg);

            if (parameter.ParameterType.FullName == "System.String")
            {
                var stringLength = ModuleDefinition.Import(typeof(string)).Resolve()
                                   .Properties.Single(p => p.Name == "Length")
                                   .GetMethod;

                ilProcessor.Append(OpCodes.Call, ModuleDefinition.Import(stringLength));
            }
            else if (parameter.ParameterType.FullName == "System.Char[]")
            {
                var arrayLength = ModuleDefinition.Import(typeof(Array)).Resolve()
                                  .Properties.Single(p => p.Name == "Length")
                                  .GetMethod;

                ilProcessor.Append(OpCodes.Call, ModuleDefinition.Import(arrayLength));
            }

            ilProcessor.Append(OpCodes.Ldc_I4_0);
            ilProcessor.Append(OpCodes.Bne_Un_S, endInstruction);

            ilProcessor.Append(OpCodes.Ldstr, "The given string cannot be empty");
            ilProcessor.Append(OpCodes.Ldstr, name);
            ilProcessor.Append(OpCodes.Newobj, GetArgumentExceptionConstructor());
            ilProcessor.Append(OpCodes.Throw);

            ilProcessor.Append(endInstruction);
        }
Example #4
0
        private void GenerateNullCheck(ParameterDefinition parameter, IlProcessorAppender ilProcessor, string name)
        {
            var endInstruction = Instruction.Create(OpCodes.Nop);

            if (parameter.ParameterType.IsValueType)
            {
                ilProcessor.Append(OpCodes.Ldarga_S, parameter);
                ilProcessor.Append(OpCodes.Call, ModuleDefinition.NullableHasValue(parameter.ParameterType.GetNullableInnerType()));
            }
            else
            {
                ilProcessor.Append(OpCodes.Ldarg, parameter);
            }

            ilProcessor.Append(OpCodes.Brtrue_S, endInstruction);
            ilProcessor.Append(OpCodes.Ldstr, name);
            ilProcessor.Append(OpCodes.Newobj, GetArgumentNullExceptionConstructor());
            ilProcessor.Append(OpCodes.Throw);
            ilProcessor.Append(endInstruction);
        }
Example #5
0
 public void Execute(NotNullOrWhiteSpaceAttribute attribute, ParameterDefinition parameter, IlProcessorAppender ilProcessor)
 {
     GenerateCheck(
         parameter,
         ilProcessor,
         parameter.Name
         );
 }