protected ClangFunctionInfoBase(CXCallingConv callConv, CXType retType, string name, IEnumerable <ClangParameterInfo> parameters) { CallConvention = callConv; ReturnType = retType; Name = name; Parameters = parameters.ToImmutableArray(); }
private string GetCallingConventionName(Cursor cursor, CXCallingConv callingConvention) { switch (callingConvention) { case CXCallingConv.CXCallingConv_C: { return("Cdecl"); } default: { Debug.WriteLine($"Unhandled calling convention: {callingConvention} in {cursor.KindSpelling}."); Debugger.Break(); return(string.Empty); } } }
private IClangType ParseDelegate(CXCursor cursor, CXCallingConv callConv) { IncrementStatistic("delegates"); var name = cursor.ToString(); var pfnType = clang.getTypedefDeclUnderlyingType(cursor); var funcType = clang.getPointeeType(pfnType); var argTypeCount = clang.getNumArgTypes(funcType); var retType = clang.getResultType(funcType); //var clrRetType = ResolveParameter(retType); var paramInfos = new ClangParameterInfo[argTypeCount]; var i = 0u; clang.visitChildren(cursor, (paramCursor, parent, p) => { if (paramCursor.kind != CXCursorKind.CXCursor_ParmDecl) { // return type if (i == 0 && paramCursor.kind == CXCursorKind.CXCursor_TypeRef) { return(CXChildVisitResult.CXChildVisit_Continue); } throw new NotImplementedException(); } var paramType = clang.getCursorType(paramCursor); var paramName = paramCursor.ToString(); if (string.IsNullOrEmpty(paramName)) { paramName = "_" + i; } //var clrArgParam = ResolveParameter(argType, paramName); if (i >= argTypeCount) { throw new NotImplementedException(); } paramInfos[i] = new ClangParameterInfo(paramType, paramName, i); ++i; return(CXChildVisitResult.CXChildVisit_Continue); }, default(CXClientData)); /* * var funcDef = Module.DefineType(name, * TypeAttributes.Sealed | TypeAttributes.Public, * typeof(MulticastDelegate)); */ return(new ClangDelegateInfo(callConv, retType, name, paramInfos)); }
private string GetCallingConventionName(Cursor cursor, CXCallingConv callingConvention, string remappedName) { if (_config.WithCallConvs.TryGetValue(remappedName, out string callConv) || _config.WithCallConvs.TryGetValue("*", out callConv)) { return(callConv); } switch (callingConvention) { case CXCallingConv.CXCallingConv_C: { return("Cdecl"); } case CXCallingConv.CXCallingConv_X86StdCall: { return("StdCall"); } case CXCallingConv.CXCallingConv_X86FastCall: { return("FastCall"); } case CXCallingConv.CXCallingConv_X86ThisCall: { return("ThisCall"); } case CXCallingConv.CXCallingConv_Win64: { return("Winapi"); } default: { var name = "Winapi"; AddDiagnostic(DiagnosticLevel.Info, $"Unsupported calling convention: '{callingConvention}'. Falling back to '{name}'.", cursor); return(name); } } }
public ClangDelegateInfo(CXCallingConv callConv, CXType retType, string name, params ClangParameterInfo[] parameters) : base(callConv, retType, name, parameters) { }
public ClangDelegateInfo(CXCallingConv callConv, CXType retType, string name, IEnumerable <ClangParameterInfo> parameters) : base(callConv, retType, name, parameters) { }