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; }
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); }