public static Exception AssertFailUnexpected(MethodDefinition method, BasicBlock block, object unexpected, [CallerMemberName] string caller = null) { string message; if (unexpected == null) { message = "got unexpected null reference"; } else if (unexpected is Instruction instruction) { message = $"got unexpected instruction `{CecilHelper.Format (instruction)}`"; } else { message = $"got unexpected `{unexpected}`"; } throw AssertFail(method, block, message, caller); }
public static bool Scan(BasicBlockScanner scanner, ref BasicBlock bb, ref int index, Instruction instruction) { var reference = (MethodReference)instruction.Operand; if (!scanner.Context.TryFastResolve(reference, out var target)) { return(false); } if (target == null) { if (reference.DeclaringType.Name.Contains("...")) { // FIXME: we don't support Ranges yet. return(false); } scanner.Context.LogMessage(MessageImportance.High, $"Cannot resolve call target: {CecilHelper.Format (instruction)}"); if (scanner.Context.Options.IgnoreResolutionErrors) { return(false); } throw new ResolutionException(reference); } scanner.LogDebug(2, $" CALL: {target}"); if (instruction.Operand is GenericInstanceMethod genericInstance) { if (scanner.Context.IsWeakInstanceOfMethod(target)) { var conditionalType = genericInstance.GenericArguments [0].Resolve(); if (conditionalType == null) { throw new ResolutionException(genericInstance.GenericArguments [0]); } IsWeakInstanceOfConditional.Create(scanner, ref bb, ref index, conditionalType); return(true); } else if (scanner.Context.AsWeakInstanceOfMethod(target)) { var conditionalType = genericInstance.GenericArguments [0].Resolve(); if (conditionalType == null) { throw new ResolutionException(genericInstance.GenericArguments [0]); } AsWeakInstanceOfConditional.Create(scanner, ref bb, ref index, conditionalType); return(true); } else if (scanner.Context.IsTypeAvailableMethod(target)) { var conditionalType = genericInstance.GenericArguments [0].Resolve(); if (conditionalType == null) { throw new ResolutionException(genericInstance.GenericArguments [0]); } IsTypeAvailableConditional.Create(scanner, ref bb, ref index, conditionalType); return(true); } return(false); } if (scanner.Context.IsFeatureSupportedMethod(target)) { IsFeatureSupportedConditional.Create(scanner, ref bb, ref index); return(true); } if (scanner.Context.IsTypeNameAvailableMethod(target)) { IsTypeAvailableConditional.Create(scanner, ref bb, ref index); return(true); } if (scanner.Context.IsRequireFeatureMethod(target)) { RequireFeatureConditional.Create(scanner, ref bb, ref index); return(true); } if (scanner.Context.TryGetConstantMethod(target, out var constant)) { ConstantCallConditional.Create(scanner, ref bb, ref index, target, constant); return(true); } return(false); }