static string NameFromClassObject(SwiftClassObject classObj) { if (classObj.IsNominalTypeDescriptorValid) { SwiftNominalTypeDescriptor nom = classObj.NominalTypeDescriptor; return(nom.GetMangledName()); } else { return(null); } }
public static string ObjectInformation(ISwiftObject obj, OutputOptions options) { string hexFormat = IntPtr.Size < 8 ? "X8" : "X16"; var writer = new StringWriter(); if (obj == null) { writer.WriteLine("ISwiftObject is null."); } else { if (obj.SwiftObject == IntPtr.Zero) { writer.WriteLine("ISwiftObject has a 0 SwiftObject."); } else { writer.WriteLine($"ISwiftObject with value {obj.SwiftObject.ToString (hexFormat)}."); writer.WriteLine($"Retain count {StructMarshal.RetainCount (obj)}."); if (!SwiftClassObject.IsSwiftClassObject(obj)) { writer.WriteLine("Unable to retrieve class object. Maybe an Objective C object?"); } else { try { SwiftClassObject classObj = SwiftClassObject.FromSwiftObject(obj); if (classObj == null) { writer.WriteLine("Unable to retrieve class object."); } else { string name = NameFromClassObject(classObj) ?? "<no name available>"; writer.WriteLine($"Instance of {name}."); } if (classObj.SuperClass != null) { string superName = NameFromClassObject(classObj.SuperClass) ?? "<no name available>"; writer.WriteLine($"Inherits from {superName}."); } writer.WriteLine($"Instance size {classObj.InstanceSize} bytes."); writer.WriteLine($"Is swift 1 class: {classObj.IsSwift1Class}."); writer.WriteLine($"Uses swift 1 reference counting: {classObj.UsesSwift1RefCounting}."); if ((options & OutputOptions.Vtable) != 0) { DumpVTable(writer, hexFormat, classObj.Vtable, classObj.VtableSize); } if ((options & OutputOptions.TypeDescriptor) != 0) { if (classObj.IsNominalTypeDescriptorValid) { DumpNominalTypeDescriptor(writer, classObj.NominalTypeDescriptor); } else { writer.WriteLine("No type descriptor."); } } } catch (Exception e) { writer.WriteLine($"Error attempting to retrieve class object: {e.Message}"); } } } } return(writer.ToString()); }