public void Execute(NotNullAttribute attribute, PropertyDefinition property, IlProcessorAppender ilProcessor) { GenerateNullCheck( property.SetMethod.Parameters.First(), ilProcessor, "value" ); }
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); }
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); }
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); }
public void Execute(NotNullOrWhiteSpaceAttribute attribute, ParameterDefinition parameter, IlProcessorAppender ilProcessor) { GenerateCheck( parameter, ilProcessor, parameter.Name ); }