public CppAssignabilityResolver(CppBuilder builder, CfgNodeCompiler.CommonTypeLookup commonTypes, CLRTypeDefRow inClass, CLRMethodDefRow inMethod)
 {
     m_builder = builder;
     m_commonTypes = commonTypes;
     m_inClass = inClass;
     m_inMethod = inMethod;
 }
示例#2
0
        public CppClass(CLRTypeSpecClass ts)
        {
            m_methods = new List<CppMethod>();
            m_fields = new List<CppField>();
            m_allVtableSlots = new List<CppVtableSlot>();
            m_overrideVisibleVtableSlots = new List<CppVtableSlot>();
            m_newImplementationVisibleVtableSlots = new List<CppVtableSlot>();
            m_inheritedFields = new List<CppField>();
            m_reimplementedInterfaces = new List<CLRTypeSpec>();
            m_newlyImplementedInterfaces = new List<CLRTypeSpec>();
            m_explicitInterfaces = new List<CLRTypeSpec>();
            m_inheritedImplementedInterfaces = new List<CLRTypeSpec>();
            m_passiveIfcConversions = new List<CLRTypeSpec>();
            m_inheritedPassiveIfcConversions = new List<CLRTypeSpec>();
            m_genericParameters = new List<CLRTypeSpec>();

            if (ts.TypeDef.GenericParameters != null)
            {
                NumGenericParameters = ts.TypeDef.GenericParameters.Length;
                for (int i = 0; i < NumGenericParameters; i++)
                    m_genericParameters.Add(new CLRTypeSpecVarOrMVar(CLRSigType.ElementType.VAR, (uint)i));
            }

            m_typeDef = ts.TypeDef;

            Name = ts.TypeDef.TypeName;
            FullName = GenerateFullPath(ts.TypeDef);
        }
示例#3
0
 public void Add(CLRTypeDefRow typeDef)
 {
     CppMangleBuilder builder = new CppMangleBuilder();
     if (typeDef.ContainerClass != null)
     {
         builder.Add(typeDef.ContainerClass);
         builder.Cycle();
     }
     builder.Add(typeDef.TypeNamespace);
     builder.Cycle();
     builder.Add(typeDef.TypeName);
     AddBytes(builder.FinishAsBytes());
 }
示例#4
0
        public static TypeNameTag CreateTypeNameTag(CLRTypeDefRow typeDef)
        {
            TypeNameTag containerTag = null;
            if (typeDef.ContainerClass != null)
                containerTag = CreateTypeNameTag(typeDef.ContainerClass);

            CLRAssemblyRow assemblyRow = (CLRAssemblyRow)typeDef.Table.MetaData.MetaDataTables.GetTable(CLRMetaDataTables.TableIndex.Assembly).GetRow(0);

            uint numGenericParameters = 0;
            if (typeDef.GenericParameters != null)
                numGenericParameters = (uint)typeDef.GenericParameters.Length;

            return new TypeNameTag(assemblyRow.Name, typeDef.TypeNamespace, typeDef.TypeName, numGenericParameters, containerTag);
        }
示例#5
0
        public CfgBuilder(ExceptionHandlingRegion region, CppBuilder builder, CppClass cls, CppMethod method, VReg[] args, VReg[] locals, IList<VReg> temporaries)
        {
            m_builder = builder;
            m_cls = cls;
            m_method = method;
            m_args = args;
            m_locals = locals;
            m_temporaries = temporaries;
            m_instrs = method.MethodDef.Method.Instructions;
            m_inClass = cls.TypeDef;
            m_inMethod = method.MethodDef;
            m_region = region;

            m_startInstr = (int)region.StartInstr;
            m_endInstr = (int)region.EndInstr;
            m_ehClusters = region.Clusters;

            LocateBranchTargets();
            ConstructCfg();
            CreateSuccessionGraph();
        }
示例#6
0
        private CppClass(CppClass baseInstance, CLRTypeSpec[] typeParams, CLRTypeSpec[] methodParams)
        {
            if (typeParams.Length != baseInstance.NumGenericParameters)
                throw new ArgumentException();

            m_methods = new List<CppMethod>();
            m_fields = new List<CppField>();
            m_allVtableSlots = new List<CppVtableSlot>();
            m_overrideVisibleVtableSlots = new List<CppVtableSlot>();
            m_newImplementationVisibleVtableSlots = new List<CppVtableSlot>();
            m_inheritedFields = new List<CppField>();
            m_reimplementedInterfaces = new List<CLRTypeSpec>();
            m_newlyImplementedInterfaces = new List<CLRTypeSpec>();
            m_explicitInterfaces = new List<CLRTypeSpec>();
            m_inheritedImplementedInterfaces = new List<CLRTypeSpec>();
            m_passiveIfcConversions = new List<CLRTypeSpec>();
            m_inheritedPassiveIfcConversions = new List<CLRTypeSpec>();
            m_genericParameters = new List<CLRTypeSpec>();

            m_typeDef = baseInstance.m_typeDef;

            Name = baseInstance.Name;
            FullName = baseInstance.FullName;
            if (baseInstance.ParentTypeSpec != null)
                ParentTypeSpec = baseInstance.ParentTypeSpec.Instantiate(typeParams, methodParams);

            NumGenericParameters = baseInstance.NumGenericParameters;
            m_genericParameters.AddRange(typeParams);

            foreach (CppMethod method in baseInstance.m_methods)
                m_methods.Add(method.Instantiate(typeParams, methodParams));
            foreach (CppField field in baseInstance.m_fields)
                m_fields.Add(field.Instantiate(typeParams, methodParams));

            foreach (CppVtableSlot vts in baseInstance.m_overrideVisibleVtableSlots)
                m_overrideVisibleVtableSlots.Add(vts.Instantiate(typeParams, methodParams));
            foreach (CppVtableSlot vts in baseInstance.m_newImplementationVisibleVtableSlots)
                m_newImplementationVisibleVtableSlots.Add(vts.Instantiate(typeParams, methodParams));
            foreach (CppVtableSlot vts in baseInstance.m_allVtableSlots)
                m_allVtableSlots.Add(vts.Instantiate(typeParams, methodParams));

            foreach (CppField field in baseInstance.m_inheritedFields)
                m_inheritedFields.Add(field.Instantiate(typeParams, methodParams));
            foreach (CLRTypeSpec impl in baseInstance.m_newlyImplementedInterfaces)
                m_newlyImplementedInterfaces.Add(impl.Instantiate(typeParams, methodParams));
            foreach (CLRTypeSpec impl in baseInstance.m_explicitInterfaces)
                m_explicitInterfaces.Add(impl.Instantiate(typeParams, methodParams));
            foreach (CLRTypeSpec impl in baseInstance.m_reimplementedInterfaces)
                m_reimplementedInterfaces.Add(impl.Instantiate(typeParams, methodParams));
            foreach (CLRTypeSpec impl in baseInstance.m_inheritedImplementedInterfaces)
                m_inheritedImplementedInterfaces.Add(impl.Instantiate(typeParams, methodParams));
            foreach (CLRTypeSpec impl in baseInstance.m_passiveIfcConversions)
                m_passiveIfcConversions.Add(impl.Instantiate(typeParams, methodParams));
            foreach (CLRTypeSpec impl in baseInstance.m_inheritedPassiveIfcConversions)
                m_inheritedPassiveIfcConversions.Add(impl.Instantiate(typeParams, methodParams));

            IsDelegate = baseInstance.IsDelegate;
            IsMulticastDelegate = baseInstance.IsMulticastDelegate;
            IsEnum = baseInstance.IsEnum;
            IsValueType = baseInstance.IsValueType;
            if (DelegateSignature != null)
                DelegateSignature = baseInstance.DelegateSignature.Instantiate(typeParams, methodParams);
            HaveNewStaticFields = baseInstance.HaveNewStaticFields;
            HaveInheritedStaticFields = baseInstance.HaveInheritedStaticFields;
            HaveAnyGenericMethods = baseInstance.HaveAnyGenericMethods;
            StubPath = null;
        }
示例#7
0
 public static string GenerateFullPath(CLRTypeDefRow typeDef)
 {
     string fullName = "";
     if (typeDef.TypeNamespace != "")
         fullName += typeDef.TypeNamespace + ".";
     fullName += typeDef.TypeName;
     if (typeDef.ContainerClass != null)
         fullName = GenerateFullPath(typeDef.ContainerClass) + "." + fullName;
     return fullName;
 }
示例#8
0
 public override void Parse(CLRMetaDataParser parser)
 {
     PackingSize = parser.ReadU16();
     ClassSize = parser.ReadU32();
     Parent = (CLRTypeDefRow)parser.ReadTable(CLRMetaDataTables.TableIndex.TypeDef);
 }
示例#9
0
 public void AddChildClass(CLRTypeDefRow childClass)
 {
     childClass.ContainerClass = this;
     m_childClasses.Add(childClass);
 }
示例#10
0
        public void ExportTypeDef(Clarity.Rpa.HighFileBuilder fileBuilder, BinaryWriter writer, CLRTypeDefRow typeDef)
        {
            CppClass cls = GetCachedClass(new CLRTypeSpecClass(typeDef));

            Clarity.Rpa.TypeSemantics sem;
            if (cls.IsDelegate)
                sem = Clarity.Rpa.TypeSemantics.Delegate;
            else if (cls.IsEnum)
                sem = Clarity.Rpa.TypeSemantics.Enum;
            else if (cls.IsValueType)
                sem = Clarity.Rpa.TypeSemantics.Struct;
            else if (cls.TypeDef.Semantics == CLRTypeDefRow.TypeSemantics.Interface)
                sem = Clarity.Rpa.TypeSemantics.Interface;
            else
                sem = Clarity.Rpa.TypeSemantics.Class;

            writer.Write((byte)sem);
            writer.Write(fileBuilder.IndexTypeNameTag(RpaTagFactory.CreateTypeNameTag(typeDef)));

            if (sem == Clarity.Rpa.TypeSemantics.Delegate)
            {
                ExportDelegate(fileBuilder, writer, cls);
            }
            else if (sem == Clarity.Rpa.TypeSemantics.Enum)
            {
                ExportEnum(fileBuilder, writer, cls);
            }
            else
            {
                ExportClassDefinitions(fileBuilder, writer, cls);
                ExportClassStubs(cls);

                if (sem == Clarity.Rpa.TypeSemantics.Class || sem == Clarity.Rpa.TypeSemantics.Struct)
                    ExportClassStatics(fileBuilder, writer, cls);
            }
        }
示例#11
0
 public void CacheTypeDef(CLRTypeDefRow typeDef)
 {
     CppClass cls = GetCachedClass(new CLRTypeSpecClass(typeDef));
     m_fullNameClasses[cls.FullName] = cls;
 }
示例#12
0
        public static CLRTypeSpec CreateInstanceTypeSpec(CLRAssemblyCollection assemblies, CLRTypeDefRow typeDefRow)
        {
            int numClassGenericParams = 0;
            if (typeDefRow.GenericParameters != null)
                numClassGenericParams = typeDefRow.GenericParameters.Length;

            if (numClassGenericParams == 0)
                return new CLRTypeSpecClass(typeDefRow);
            else
            {
                List<CLRTypeSpec> genericParams = new List<CLRTypeSpec>();
                for (int i = 0; i < numClassGenericParams; i++)
                    genericParams.Add(new CLRTypeSpecVarOrMVar(CLRSigType.ElementType.VAR, (uint)i));

                // Sigh...
                // This would be easier if we just resolved from the class down, but we currently allow
                // free-floating methods to be resolved.
                CLRSigTypeGenericInstantiation.InstType instType = CLRSigTypeGenericInstantiation.InstType.Class;
                {
                    CLRTableRow extendsRow = typeDefRow.Extends;
                    if (extendsRow != null)
                    {
                        CLRTypeSpec parentTypeSpec = assemblies.InternTypeDefOrRefOrSpec(typeDefRow.Extends);
                        if (parentTypeSpec is CLRTypeSpecClass)
                        {
                            CLRTypeDefRow parentClassDef = ((CLRTypeSpecClass)parentTypeSpec).TypeDef;
                            if (parentClassDef.ContainerClass == null && parentClassDef.TypeNamespace == "System" && (parentClassDef.TypeName == "ValueType" || parentClassDef.TypeName == "Enum"))
                                instType = CLRSigTypeGenericInstantiation.InstType.ValueType;
                        }
                    }
                }

                return new CLRTypeSpecGenericInstantiation(instType, new CLRTypeSpecClass(typeDefRow), genericParams.ToArray());
            }
        }