protected internal unsafe override SwiftType GetSwiftType(Type attributedType, SwiftType []?typeArgs) { if (mangledName is null) { mangledName = SwiftType.Mangle(attributedType); } if (typeArgs is null) { return(new SwiftType(lib, mangledName, attributedType)); } // If this is generic, then it might be a couple different things. if (!mangledName.StartsWith("$s", StringComparison.Ordinal)) { mangledName = "$s" + mangledName; } if (mangledName.EndsWith("MQ", StringComparison.Ordinal)) { // opaque type var args = stackalloc void * [typeArgs.Length]; for (var i = 0; i < typeArgs.Length; i++) { args [i] = typeArgs [i].Metadata; } return(new SwiftType(lib, SwiftCoreLib.GetOpaqueTypeMetadata(0, args, lib.RequireSymbol(mangledName), 0))); } else { // get type from metadata accessor function if (!mangledName.EndsWith("Mp", StringComparison.Ordinal)) { mangledName += "Ma"; } var ftnPtr = lib.RequireSymbol(mangledName); var args = new List <object> (typeArgs.Length * 2); args.Add((long)0); // metadataReq arg // determine how many additional arguments based on number of generic parameters and constraints var tparams = attributedType.GetGenericTypeDefinition().GetGenericArguments(); for (var i = 0; i < typeArgs.Length; i++) { args.Add((IntPtr)typeArgs [i].Metadata); // also add any constraints var constraints = tparams [i].GetGenericParameterConstraints(); foreach (var constr in constraints) { var attr = constr.GetCustomAttribute <SwiftProtocolAttribute> (inherit: false); if (attr != null) { args.Add((IntPtr)typeArgs [i].GetProtocolConformance(attr.Descriptor)); } } } var del = MetadataReq.MakeDelegate(args.Count - 1, ftnPtr); return(new SwiftType(lib, (IntPtr)del.DynamicInvoke(args.ToArray()), null, attributedType, typeArgs)); } }
protected virtual ProtocolWitnessTable *CreateViewConformance() { viewConformanceDesc = (ViewProtocolConformanceDescriptor *)Marshal.AllocHGlobal(sizeof(ViewProtocolConformanceDescriptor)); // zero everything first *viewConformanceDesc = default; viewConformanceDesc->Populate(Metadata->TypeDescriptor); var bodySwiftType = SwiftType.Of(BodyProperty.PropertyType) !; var bodyConformance = bodySwiftType.GetProtocolConformance(SwiftUILib.ViewProtocol); var witnessTable = SwiftCoreLib.GetProtocolWitnessTable(&viewConformanceDesc->ConformanceDescriptor, Metadata, null); viewConformanceDesc->FixupAndRegister( witnessTable, bodyConformance, bodySwiftType.Metadata, SwiftGlueLib.BodyProtocolWitness); return(witnessTable); }