Exemple #1
0
        private static ReadOnlyCollection <byte> GetDynamicFlags(CustomAttributeData attribute)
        {
            var arguments = attribute.ConstructorArguments;

            if (arguments.Count == 0)
            {
                return(DynamicFlagsTrue);
            }
            else if (arguments.Count == 1)
            {
                var argument     = arguments[0];
                var argumentType = argument.ArgumentType;
                if (argumentType.IsArray && argumentType.GetElementType().IsBoolean())
                {
                    var collection = GetAttributeArrayArgumentValue(argument);
                    var numFlags   = collection.Count;
                    var builder    = ArrayBuilder <bool> .GetInstance(numFlags);

                    foreach (var typedArg in collection)
                    {
                        builder.Add((bool)typedArg.Value);
                    }
                    var result = DynamicFlagsCustomTypeInfo.ToBytes(builder);
                    builder.Free();
                    return(result);
                }
            }
            return(null);
        }
Exemple #2
0
        private ReadOnlyCollection <byte> SubstituteDynamicFlags(Type type, ReadOnlyCollection <byte> dynamicFlagsOpt)
        {
            var builder = ArrayBuilder <bool> .GetInstance();

            int f = 0;

            foreach (Type curr in new TypeWalker(type))
            {
                if (curr.IsGenericParameter && curr.DeclaringType.Equals(_typeDefinition))
                {
                    AppendRangeFor(
                        curr,
                        _dynamicFlags,
                        _dynamicFlagStartIndices,
                        DynamicFlagsCustomTypeInfo.GetFlag,
                        builder);
                }
                else
                {
                    builder.Add(DynamicFlagsCustomTypeInfo.GetFlag(dynamicFlagsOpt, f));
                }

                f++;
            }

            var result = DynamicFlagsCustomTypeInfo.ToBytes(builder);

            builder.Free();
            return(result);
        }
Exemple #3
0
        internal static DkmClrCustomTypeInfo MakeCustomTypeInfo(params bool[] dynamicFlags)
        {
            if (dynamicFlags == null || dynamicFlags.Length == 0)
            {
                return(null);
            }

            var builder = ArrayBuilder <bool> .GetInstance(dynamicFlags.Length);

            builder.AddRange(dynamicFlags);
            var result = CustomTypeInfo.Create(DynamicFlagsCustomTypeInfo.ToBytes(builder), tupleElementNames: null);

            builder.Free();
            return(result);
        }