private void ExportDelegate(Clarity.Rpa.HighFileBuilder fileBuilder, BinaryWriter writer, CppClass cls) { writer.Write(cls.IsMulticastDelegate); ExportGenericVariance(cls, writer); foreach (CppMethod method in cls.Methods) { if (method.Name == "Invoke") { writer.Write(fileBuilder.IndexMethodSignatureTag(RpaTagFactory.CreateMethodSignature(method.MethodSignature))); return; } } throw new ParseFailedException("Malformed delegate"); }
private void WriteVtableThunk(Clarity.Rpa.HighFileBuilder fileBuilder, BinaryWriter writer, CppClass cls, CppMethod method, CppVtableSlot slot) { CLRMethodSignatureInstance slotSig = slot.Signature; writer.Write(fileBuilder.IndexMethodDeclTag(slot.VtableSlotTag)); writer.Write(fileBuilder.IndexMethodSignatureTag(RpaTagFactory.CreateMethodSignature(slot.Signature))); if (cls.TypeDef.Semantics != CLRTypeDefRow.TypeSemantics.Interface) { writer.Write(method.Abstract); if (!method.Abstract) { if (method.NumGenericParameters == 0) writer.Write(method.Final); if (method.Static) throw new Exception("VTable slot implemented by static method"); writer.Write(fileBuilder.IndexMethodDeclTag(method.VtableSlotTag)); } } }
private void ExportClassDefinitions(Clarity.Rpa.HighFileBuilder fileBuilder, BinaryWriter writer, CppClass cls) { if (cls.IsDelegate || cls.IsEnum) throw new ArgumentException(); if (cls.TypeDef.Semantics == CLRTypeDefRow.TypeSemantics.Interface) ExportGenericVariance(cls, writer); if (!cls.IsValueType && cls.TypeDef.Semantics == CLRTypeDefRow.TypeSemantics.Class) { writer.Write(cls.TypeDef.IsSealed); writer.Write(cls.TypeDef.IsAbstract); if (cls.ParentTypeSpec == null) writer.Write((uint)0); else writer.Write(1 + fileBuilder.IndexTypeSpecTag(RpaTagFactory.CreateTypeTag(cls.ParentTypeSpec))); } writer.Write((uint)cls.ExplicitInterfaces.Count); foreach (CLRTypeSpec typeSpec in cls.ExplicitInterfaces) writer.Write(fileBuilder.IndexTypeSpecTag(RpaTagFactory.CreateTypeTag(typeSpec))); WriteVtableThunks(fileBuilder, writer, cls); if (cls.TypeDef.Semantics == CLRTypeDefRow.TypeSemantics.Class) { uint numNonAbstractMethods = 0; foreach (CppMethod method in cls.Methods) { if (!method.Abstract) numNonAbstractMethods++; } writer.Write(numNonAbstractMethods); foreach (CppMethod method in cls.Methods) { if (method.Abstract) continue; writer.Write(method.Static); writer.Write(fileBuilder.IndexMethodSignatureTag(RpaTagFactory.CreateMethodSignature(method.MethodSignature))); writer.Write(fileBuilder.IndexString(method.Name)); ExportMethodCode(fileBuilder, writer, cls, method); } uint numInstanceFields = 0; foreach (CppField field in cls.Fields) { CLRFieldRow fieldDef = field.Field; if (!fieldDef.Literal && !fieldDef.Static) numInstanceFields++; } writer.Write(numInstanceFields); foreach (CppField field in cls.Fields) { CLRFieldRow fieldDef = field.Field; if (!fieldDef.Literal && !fieldDef.Static) { writer.Write(fileBuilder.IndexTypeSpecTag(RpaTagFactory.CreateTypeTag(field.Type))); writer.Write(fileBuilder.IndexString(field.Name)); } } WriteInterfaceImplementations(fileBuilder, writer, cls); } }