private String GetCodeForDelegate(TypeDesc delegateType) { StringBuilder sb = new StringBuilder(); MethodDesc method = delegateType.GetMethod("Invoke", null); AppendSlotTypeDef(sb, method); sb.Append("static __slot__"); sb.Append(GetCppMethodName(method)); sb.Append(" __invoke__"); sb.Append(GetCppMethodName(method)); sb.Append("(void * pThis) { return (__slot__"); sb.Append(GetCppMethodName(method)); sb.Append(")((("); sb.Append(GetCppSignatureTypeName(_compilation.TypeSystemContext.GetWellKnownType(WellKnownType.MulticastDelegate))); sb.Append(")pThis)->m_functionPointer);"); sb.AppendLine(" };"); return sb.ToString(); }
private void TriggerCctor(TypeDesc type) { // TODO: Before field init MethodDesc cctor = type.GetMethod(".cctor", null); if (cctor == null) return; // TODO: Thread safety string ctorHasRun = "__statics.__cctor_" + _writer.GetCppTypeName(type).Replace("::", "__"); Append("if (!" + ctorHasRun + ") { " + ctorHasRun + " = true; "); Append(_writer.GetCppTypeName(cctor.OwningType)); Append("::"); Append(_writer.GetCppMethodName(cctor)); Append("(); }"); _compilation.AddMethod(cctor); }
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.GetMethod("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); } }