예제 #1
0
        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));
            }
        }
예제 #2
0
        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);
        }