コード例 #1
0
 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);
         }
     }
 }
コード例 #2
0
            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);
            }
コード例 #3
0
            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"));
            }
コード例 #4
0
ファイル: WeavingContext.cs プロジェクト: n9/NObservable
        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");
        }
コード例 #5
0
        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");
        }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 public PropertySetterImplementor(PropertyDefinition propertyDefinition, TypeSystem typeSystem)
 {
     _propertyDefinition = propertyDefinition;
     _typeSystem         = typeSystem;
 }