public CppAssignabilityResolver(CppBuilder builder, CfgNodeCompiler.CommonTypeLookup commonTypes, CLRTypeDefRow inClass, CLRMethodDefRow inMethod) { m_builder = builder; m_commonTypes = commonTypes; m_inClass = inClass; m_inMethod = inMethod; }
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); }
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()); }
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); }
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(); }
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; }
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; }
public override void Parse(CLRMetaDataParser parser) { PackingSize = parser.ReadU16(); ClassSize = parser.ReadU32(); Parent = (CLRTypeDefRow)parser.ReadTable(CLRMetaDataTables.TableIndex.TypeDef); }
public void AddChildClass(CLRTypeDefRow childClass) { childClass.ContainerClass = this; m_childClasses.Add(childClass); }
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); } }
public void CacheTypeDef(CLRTypeDefRow typeDef) { CppClass cls = GetCachedClass(new CLRTypeSpecClass(typeDef)); m_fullNameClasses[cls.FullName] = cls; }
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()); } }