private String GetCodeForDelegate(TypeDesc delegateType) { var sb = new CppGenerationBuffer(); MethodDesc method = delegateType.GetKnownMethod("Invoke", null); AppendSlotTypeDef(sb, method); sb.AppendLine(); sb.Append("static __slot__"); sb.Append(GetCppMethodName(method)); sb.Append(" __invoke__"); sb.Append(GetCppMethodName(method)); sb.Append("(void * pThis)"); sb.AppendLine(); sb.Append("{"); sb.Indent(); sb.AppendLine(); sb.Append("return (__slot__"); sb.Append(GetCppMethodName(method)); sb.Append(")((("); sb.Append(GetCppSignatureTypeName(_compilation.TypeSystemContext.GetWellKnownType(WellKnownType.MulticastDelegate))); sb.Append(")pThis)->m_functionPointer);"); sb.Exdent(); sb.AppendLine(); sb.Append("};"); return sb.ToString(); }
private void ExpandType(TypeDesc type) { if (_emittedTypes.Contains(type)) return; _emittedTypes.Add(type); GetCppSignatureTypeName(type); var baseType = type.BaseType; if (baseType != null) { ExpandType(baseType); } foreach (var field in type.GetFields()) { ExpandType(GetFieldTypeOrPlaceholder(field)); } if (type.IsDelegate) { MethodDesc method = type.GetKnownMethod("Invoke", null); var sig = method.Signature; ExpandType(sig.ReturnType); for (int i = 0; i < sig.Length; i++) ExpandType(sig[i]); } if (type.IsArray) { ExpandType(((ArrayType)type).ElementType); } }