internal static void Process(MethodBody body, Fody.TypeSystem typeLoader) { for (var instruction = body.Instructions[0]; instruction != null; instruction = instruction.Next) { if (instruction.OpCode.FlowControl == FlowControl.Call && instruction.Operand is MethodReference methodRef && methodRef.DeclaringType.Namespace == Namespace && methodRef.DeclaringType.IsValueType && methodRef.Name == ConstructorName && methodRef.Parameters.Count == 2 && (methodRef.DeclaringType.Name.StartsWith(ValueFuncType) || methodRef.DeclaringType.Name.StartsWith(ValueActionType))) { ReplaceValueDelegateConstruction(body.GetILProcessor(), methodRef, instruction, typeLoader); } } }
public NetStandard2(ModuleDefinition module, Fody.TypeSystem types, FrameworkName frameworkName) : base(module, types, frameworkName) { IQueryableOfT = new TypeReference("System.Linq", "IQueryable`1", Module, Module.TypeSystem.CoreLibrary); IQueryableOfT.GenericParameters.Add(new GenericParameter(IQueryableOfT)); System_Collections_Generic_ListOfT = new TypeReference("System.Collections.Generic", "List`1", Module, Module.TypeSystem.CoreLibrary); System_Collections_Generic_ListOfT.GenericParameters.Add(new GenericParameter(System_Collections_Generic_ListOfT)); System_Linq_Enumerable = new TypeReference("System.Linq", "Enumerable", Module, Module.TypeSystem.CoreLibrary); System_Linq_Queryable = new TypeReference("System.Linq", "Queryable", Module, Module.TypeSystem.CoreLibrary); }
public NETPortable(ModuleDefinition module, Fody.TypeSystem types, FrameworkName frameworkName) : base(module, types, frameworkName) { IQueryableOfT = new TypeReference("System.Linq", "IQueryable`1", Module, GetOrAddFrameworkReference("System.Linq.Expressions")); IQueryableOfT.GenericParameters.Add(new GenericParameter(IQueryableOfT)); System_Collections_Generic_ListOfT = new TypeReference("System.Collections.Generic", "List`1", Module, GetOrAddFrameworkReference("System.Collections")); System_Collections_Generic_ListOfT.GenericParameters.Add(new GenericParameter(System_Collections_Generic_ListOfT)); System_Linq_Enumerable = new TypeReference("System.Linq", "Enumerable", Module, GetOrAddFrameworkReference("System.Linq")); System_Linq_Queryable = new TypeReference("System.Linq", "Queryable", Module, GetOrAddFrameworkReference("System.Linq.Queryable")); }
public WeavingContext(TypeSystem typeSystem, ModuleWeaver weaver, ModuleDefinition moduleDefinition) { _weaver = weaver; TypeSystem = typeSystem; ModuleDefinition = moduleDefinition; var blazorRef = moduleDefinition.AssemblyReferences.FirstOrDefault(asm => asm.Name == "NObservable.Blazor"); if (blazorRef != null) { var helperType = "NObservable.Blazor.Internals.NObservableBlazorComponentHelper"; BlazorHelperAsm = ModuleDefinition.AssemblyResolver.Resolve(blazorRef); BlazorComponentHelperReference = ImportType(BlazorHelperAsm, helperType); BlazorComponentHelperCtorReference = ImportMethod(BlazorHelperAsm, helperType, ".ctor"); BlazorComponentHelperOnRenderEnterReference = ImportMethod(BlazorHelperAsm, helperType, "OnRenderEnter"); BlazorComponentHelperOnRenderLeaveReference = ImportMethod(BlazorHelperAsm, helperType, "OnRenderLeave"); BlazorComponentHelperShouldRenderReference = ImportMethod(BlazorHelperAsm, helperType, "ShouldRender"); BlazorComponentHelperOnParametersSetReference = ImportMethod(BlazorHelperAsm, helperType, "OnParametersSet"); } var nobservableRef = ModuleDefinition.AssemblyReferences.FirstOrDefault(asm => asm.Name == "NObservable") ?? BlazorHelperAsm?.MainModule.AssemblyReferences.FirstOrDefault(asm => asm.Name == "NObservable"); if (nobservableRef == null) { Abort("Reference to NObservable not found"); } NObservableAsm = ModuleDefinition.AssemblyResolver.Resolve(nobservableRef); PropertyTrackerReference = ImportType("NObservable.Internals.PropertyTracker"); PropertyTrackerInitReference = ImportMethod("NObservable.Internals.PropertyTracker", "Init"); PropertyTrackerTrackGetReference = ImportMethod("NObservable.Internals.PropertyTracker", "TrackGet"); PropertyTrackerTrackSetReference = ImportMethod("NObservable.Internals.PropertyTracker", "TrackSet"); PropertyTrackerEnterTrackSetReference = ImportMethod("NObservable.Internals.PropertyTracker", "EnterTrackSet"); PropertyTrackerLeaveTrackSetReference = ImportMethod("NObservable.Internals.PropertyTracker", "LeaveTrackSet"); ObservableAttributeReference = ImportType("NObservable.ObservableAttribute"); PropertyCountAttributeReference = ImportType("NObservable.Internals.NObservablePropertyCountAttribute"); PropertyCountAttributeCtorReference = ImportMethod("NObservable.Internals.NObservablePropertyCountAttribute", ".ctor"); }
public WeavingContext(TypeSystem typeSystem, ModuleDefinition moduleDefinition) { TypeSystem = typeSystem; ModuleDefinition = moduleDefinition; var nobservableRef = ModuleDefinition.AssemblyReferences.FirstOrDefault(asm => asm.Name == "NObservable"); if (nobservableRef == null) { throw new Exception("Reference to NObervable not found"); } NObservableAsm = ModuleDefinition.AssemblyResolver.Resolve(nobservableRef); PropertyTrackerReference = ImportType("NObservable.Internals.PropertyTracker"); PropertyTrackerInitReference = ImportMethod("NObservable.Internals.PropertyTracker", "Init"); PropertyTrackerTrackGetReference = ImportMethod("NObservable.Internals.PropertyTracker", "TrackGet"); PropertyTrackerTrackSetReference = ImportMethod("NObservable.Internals.PropertyTracker", "TrackSet"); PropertyTrackerEnterTrackSetReference = ImportMethod("NObservable.Internals.PropertyTracker", "EnterTrackSet"); PropertyTrackerLeaveTrackSetReference = ImportMethod("NObservable.Internals.PropertyTracker", "LeaveTrackSet"); ObservableAttributeReference = ImportType("NObservable.ObservableAttribute"); PropertyCountAttributeReference = ImportType("NObservable.Internals.NObservablePropertyCountAttribute"); PropertyCountAttributeCtorReference = ImportMethod("NObservable.Internals.NObservablePropertyCountAttribute", ".ctor"); }
protected ImportedReferences(ModuleDefinition module, Fody.TypeSystem types, FrameworkName frameworkName) { Module = module; Types = types; Framework = frameworkName; IEnumerableOfT = new TypeReference("System.Collections.Generic", "IEnumerable`1", Module, Module.TypeSystem.CoreLibrary); IEnumerableOfT.GenericParameters.Add(new GenericParameter(IEnumerableOfT)); ICollectionOfT = new TypeReference("System.Collections.Generic", "ICollection`1", Module, Module.TypeSystem.CoreLibrary); ICollectionOfT.GenericParameters.Add(new GenericParameter(ICollectionOfT)); IListOfT = new TypeReference("System.Collections.Generic", "IList`1", Module, Module.TypeSystem.CoreLibrary); IListOfT.GenericParameters.Add(new GenericParameter(IListOfT)); System_ValueType = new TypeReference("System", "ValueType", Module, Module.TypeSystem.CoreLibrary); System_IFormattable = new TypeReference("System", "IFormattable", Module, Module.TypeSystem.CoreLibrary); System_IComparableOfT = new TypeReference("System", "IComparable`1", Module, Module.TypeSystem.CoreLibrary); System_IComparableOfT.GenericParameters.Add(new GenericParameter(System_IComparableOfT)); System_NullableOfT = new TypeReference("System", "Nullable`1", Module, Module.TypeSystem.CoreLibrary) { IsValueType = true }; System_NullableOfT.GenericParameters.Add(new GenericParameter(System_NullableOfT) { Constraints = { new GenericParameterConstraint(System_ValueType) } }); System_NullableOfT_GetValueOrDefault = new MethodReference("GetValueOrDefault", System_NullableOfT.GenericParameters[0], System_NullableOfT) { HasThis = true }; System_NullableOfT_Ctor = new MethodReference(".ctor", Types.VoidReference, System_NullableOfT) { HasThis = true, Parameters = { new ParameterDefinition(System_NullableOfT.GenericParameters[0]) } }; var runtimeTypeHandle = new TypeReference("System", "RuntimeTypeHandle", Module, Module.TypeSystem.CoreLibrary) { IsValueType = true }; System_Type = new TypeReference("System", "Type", Module, Module.TypeSystem.CoreLibrary); System_Type_GetTypeFromHandle = new MethodReference("GetTypeFromHandle", System_Type, System_Type) { HasThis = false, Parameters = { new ParameterDefinition(runtimeTypeHandle) } }; System_DateTimeOffset = new TypeReference("System", "DateTimeOffset", Module, Module.TypeSystem.CoreLibrary, valueType: true); // If the assembly has a reference to PropertyChanged.Fody, let's look up the DoNotNotifyAttribute for use later. var PropertyChanged_Fody = Module.AssemblyReferences.SingleOrDefault(a => a.Name == "PropertyChanged"); if (PropertyChanged_Fody != null) { InitializePropertyChanged_Fody(PropertyChanged_Fody); } }
private static void ReplaceValueDelegateConstruction(ILProcessor processor, MethodReference ctor, Instruction instruction, Fody.TypeSystem typeLoader) { /* * ldnull * ldftn <static method> * newobj <DelegateType>::.ctor(object target, IntPtr method) * ldc_i4_0 * newobj ValueDelegate::.ctor(<DelegateType>, bool) */ //find sequence point for mapping var debugInfo = processor.Body.Method.DebugInformation; var sequencePoint = FindSequencePoint(debugInfo, instruction); //ldc_i4_0 var loadFalse = instruction.Previous; if (loadFalse is null || loadFalse.OpCode.Code != Code.Ldc_I4_0) { return; } //newobj var newDelegate = loadFalse.Previous; if (newDelegate is null || newDelegate.OpCode.Code != Code.Newobj) { return; } //ldftn var ldftn = newDelegate.Previous; if (ldftn is null || ldftn.OpCode.Code != Code.Ldftn) { return; } //ldnull var loadNull = ldftn.Previous; if (loadNull is null || loadNull.OpCode.Code != Code.Ldnull) { return; } //extract method from ldftn if (!(ldftn.Operand is MethodReference methodRef) || methodRef.HasThis || methodRef.ExplicitThis) { return; } //remove all redundant instructions processor.Remove(loadNull); processor.Remove(newDelegate); processor.Remove(loadFalse); //replace ValueDelegate constructor with its specialized version ctor = Rewrite(processor.Body.Method.Module, ctor, typeLoader); var newInstruction = Instruction.Create(instruction.OpCode, ctor); processor.Replace(instruction, newInstruction); //remap sequence points if (sequencePoint != null && debugInfo.SequencePoints.Count == 0) { debugInfo.SequencePoints.Add(sequencePoint); } }
private static MethodReference Rewrite(ModuleDefinition module, MethodReference ctor, Fody.TypeSystem typeLoader) { var result = new MethodReference(ctor.Name, ctor.ReturnType, ctor.DeclaringType) { HasThis = ctor.HasThis }; var modreq = module.ImportReference(ctor.Resolve().Module.GetType(ManagedMethodPointerType)); modreq = typeLoader.IntPtrReference.MakeRequiredModifierType(modreq); result.Parameters.Add(new ParameterDefinition(modreq)); return(result); }
public PropertySetterImplementor(PropertyDefinition propertyDefinition, TypeSystem typeSystem) { _propertyDefinition = propertyDefinition; _typeSystem = typeSystem; }