Ejemplo n.º 1
0
        public PodFlags GetClassPodFlags(Compiler compiler, CliClass cls)
        {
            PodFlags podFlags = PodFlags.None;
            foreach (HighField fld in cls.InstanceFields)
            {
                TypeSpecTag fldType = fld.Type;

                if (!compiler.TypeIsValueType(fldType))
                    return PodFlags.None;

                CliClass fldClass = compiler.GetClosedClass((TypeSpecClassTag)fldType);

                podFlags &= GetClassPodFlags(compiler, fldClass);
                if (podFlags == PodFlags.None)
                    return PodFlags.None;
            }

            return podFlags;
        }
Ejemplo n.º 2
0
        private List<MethodHandle> GenerateVTableForArray(Compiler compiler, TypeSpecArrayTag typeSpec)
        {
            TypeSpecClassTag baseClass;

            if (typeSpec.IsSZArray)
            {
                TypeSpecTag subscriptType = typeSpec.SubscriptType;
                if (compiler.TypeIsValueType(typeSpec.SubscriptType))
                {
                    TypeSpecClassTag subscriptClassTag = (TypeSpecClassTag)subscriptType;
                    TypeNameTag subscriptClassName = subscriptClassTag.TypeName;

                    if (subscriptClassName.FastIs("mscorlib", "System", "Nullable`1", 1, null))
                    {
                        TypeNameTag baseName = new TypeNameTag("mscorlib", "Clarity", "NullableSZArray`1", 1, null);
                        baseName = compiler.TagRepository.InternTypeName(baseName);

                        baseClass = new TypeSpecClassTag(baseName, subscriptClassTag.ArgTypes);
                        baseClass = (TypeSpecClassTag)compiler.TagRepository.InternTypeSpec(baseClass);
                    }
                    else
                    {
                        TypeNameTag baseName = new TypeNameTag("mscorlib", "Clarity", "ValueSZArray`1", 1, null);
                        baseName = compiler.TagRepository.InternTypeName(baseName);

                        baseClass = new TypeSpecClassTag(baseName, new TypeSpecTag[] { subscriptClassTag });
                        baseClass = (TypeSpecClassTag)compiler.TagRepository.InternTypeSpec(baseClass);
                    }
                }
                else
                {
                    TypeNameTag baseName = new TypeNameTag("mscorlib", "Clarity", "RefSZArray");
                    baseName = compiler.TagRepository.InternTypeName(baseName);

                    baseClass = new TypeSpecClassTag(baseName, new TypeSpecTag[0]);
                    baseClass = (TypeSpecClassTag)compiler.TagRepository.InternTypeSpec(baseClass);
                }
            }
            else
                throw new NotImplementedException("Multidimensional arrays not implemented");

            return GenerateVTableForClass(compiler, baseClass);
        }