Пример #1
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     foreach (var argumentType in Type.GetGenericArguments())
     {
         context.BuildConstants(argumentType);
     }
 }
        public IntPtr BuildSizeCounter(Type type, bool ignoreCustomSerialization)
        {
            var constantsBuilder = module.DefineType(type.Name + "_GroBufSizeCounterConstants_" + Guid.NewGuid(), TypeAttributes.Class | TypeAttributes.Public);

            constantsBuilder.DefineField("pointers", typeof(IntPtr[]), FieldAttributes.Private | FieldAttributes.Static);
            constantsBuilder.DefineField("delegates", typeof(Delegate[]), FieldAttributes.Private | FieldAttributes.Static);
            var constantsBuilderContext = new SizeCounterConstantsBuilderContext(groBufWriter, constantsBuilder, sizeCounterCollection, dataMembersExtractor);

            constantsBuilderContext.BuildConstants(type, true, ignoreCustomSerialization);
            var constantsType = constantsBuilder.CreateType();
            var fields        = constantsBuilderContext.GetFields().ToDictionary(pair => pair.Key, pair => pair.Value.Select(constantsType.GetField).ToArray());
            var context       = new SizeCounterBuilderContext(groBufWriter, module, constantsType, fields, sizeCounterCollection, dataMembersExtractor);
            var sizeCounter   = context.GetCounter(type, true, ignoreCustomSerialization);

            var initializer = BuildInitializer(constantsType.GetField("pointers", BindingFlags.Static | BindingFlags.NonPublic),
                                               constantsType.GetField("delegates", BindingFlags.Static | BindingFlags.NonPublic));

            var compiledDynamicMethods = context.GetMethods();
            var pointers  = new IntPtr[compiledDynamicMethods.Length];
            var delegates = new Delegate[compiledDynamicMethods.Length];

            foreach (var pair in compiledDynamicMethods)
            {
                var compiledDynamicMethod = pair.Value;
                var index = compiledDynamicMethod.Index;
                pointers[index]  = compiledDynamicMethod.Pointer;
                delegates[index] = compiledDynamicMethod.Delegate;
                if (compiledDynamicMethod.Pointer != sizeCounter.Pointer)
                {
                    groBufWriter.countersWithCustomSerialization[pair.Key] = (IntPtr?)compiledDynamicMethod.Pointer;
                }
            }
            initializer(pointers, delegates, context.GetFieldInitializers());
            return(sizeCounter.Pointer);
        }
Пример #3
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.SetFields(Type, new[]
     {
         new KeyValuePair <string, Type>("hashCodes_" + Type.Name + "_" + Guid.NewGuid(), typeof(ulong[])),
         new KeyValuePair <string, Type>("values_" + Type.Name + "_" + Guid.NewGuid(), typeof(int[])),
     });
 }
Пример #4
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.SetFields(Type, new[]
     {
         new KeyValuePair <string, Type>("counters_" + Type.Name + "_" + Guid.NewGuid(), typeof(IntPtr[])),
         new KeyValuePair <string, Type>("delegates_" + Type.Name + "_" + Guid.NewGuid(), typeof(Delegate[]))    // This field is needed only to save references to the dynamic methods. Otherwise GC will destroy them
     });
     Array.ForEach(GroBufHelpers.LeafTypes.Where(type => type != null).ToArray(), type => context.BuildConstants(type));
 }
Пример #5
0
        protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
        {
            foreach (var member in context.GetDataMembers(Type))
            {
                Type memberType;
                switch (member.Member.MemberType)
                {
                case MemberTypes.Property:
                    memberType = ((PropertyInfo)member.Member).PropertyType;
                    break;

                case MemberTypes.Field:
                    memberType = ((FieldInfo)member.Member).FieldType;
                    break;

                default:
                    throw new NotSupportedException("Data member of type " + member.Member.MemberType + " is not supported");
                }
                context.BuildConstants(memberType);
            }
        }
Пример #6
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.BuildConstants(elementType);
 }
Пример #7
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
 }
Пример #8
0
 protected abstract void BuildConstantsInternal(SizeCounterConstantsBuilderContext context);
Пример #9
0
 public void BuildConstants(SizeCounterConstantsBuilderContext context)
 {
     context.SetFields(Type, new KeyValuePair <string, Type> [0]);
     BuildConstantsInternal(context);
 }
Пример #10
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.SetFields(Type, new[] { new KeyValuePair <string, Type>("customSerializer_" + Type.Name + "_" + Guid.NewGuid(), typeof(IGroBufCustomSerializer)) });
 }
Пример #11
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.BuildConstants(Type.GetGenericArguments()[0]);
 }
Пример #12
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.BuildConstants(typeof(object));
 }
Пример #13
0
 protected override void BuildConstantsInternal(SizeCounterConstantsBuilderContext context)
 {
     context.BuildConstants(keyType);
     context.BuildConstants(valueType);
 }